Dockerfile
Aula 2 de 7
Estrutura do Dockerfile
# syntax=docker/dockerfile:1
FROM node:20-alpine AS base
LABEL maintainer="[email protected]"
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production && npm cache clean --force
FROM base AS dev
RUN npm install -g nodemon
COPY . .
CMD ["nodemon", "server.js"]
FROM base AS prod
COPY . .
USER node
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
CMD curl -f http://localhost:3000/health || exit 1
CMD ["node", "server.js"]
Instruções Essenciais
FROM python:3.12-slim # Imagem base (sempre prefira slim/alpine)
WORKDIR /app # Diretório de trabalho
COPY requirements.txt . # Copia arquivos específicos
COPY . . # Copia tudo (use .dockerignore)
RUN pip install -r requirements.txt # Comando em tempo de build
EXPOSE 8000 # Documenta porta (não publica)
CMD ["python", "app.py"] # Comando padrão
ENTRYPOINT ["python"] # Entry point (CMD vira argumento)
Multi-stage Build
# Stage 1: Build
FROM golang:1.22-alpine AS builder
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o /app .
# Stage 2: Runtime (mínimo)
FROM scratch
COPY --from=builder /app /app
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
EXPOSE 8080
ENTRYPOINT ["/app"]
docker build -t meu-app:latest .
docker images | grep meu-app # ~10MB (vs ~500MB com Go SDK)
.dockerignore
node_modules
.git
.env
*.md
Dockerfile
docker-compose.yml
.gitignore
dist/
.cache/
*.log
Boas Práticas
# 1. Camadas (RUNs agrupados)
# RUIM
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get clean
# BOM
RUN apt-get update && apt-get install -y curl \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
# 2. Não rodar como root
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
# 3. Healthcheck
HEALTHCHECK --interval=30s --timeout=5s \
CMD curl -f http://localhost:8080/ || exit 1
Lab: Dockerfile Python
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
RUN adduser -D appuser
USER appuser
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
docker build -t minha-api:1.0 .
docker run -d -p 8000:8000 --name api minha-api:1.0
docker inspect api | grep IPAddress
Multi-stage builds reduzem drasticamente o tamanho final. Prefira imagens slim/alpine. Sempre use .dockerignore para não enviar lixo para o build context.