Dockerfile mal escrito gera imagens gigantes e inseguras. Aprenda técnicas que reduzem tamanho em 90% e melhoram performance drasticamente.
Conceitos Principais
Layer Caching
Cada instrução cria layer. Docker cacheia layers inalteradas. Ordene instruções: menos mutáveis primeiro. COPY package.json antes de COPY código.
Multi-Stage Build
Múltiplos FROM no mesmo Dockerfile. Stage de build (com dev deps) e stage final (só runtime). Copia artefatos entre stages. Reduz tamanho drasticamente.
Base Images
Alpine (5MB) vs Ubuntu (80MB). Node:18-alpine ideal. Distroless para segurança máxima. Evite tags latest, fixe versão específica.
.dockerignore
Exclui arquivos do build context. node_modules, .git, tests não vão pra imagem. Build fica mais rápido, imagem menor.
Passo a Passo
- Escolha Base Correta: Use node:18-alpine ao invés de node:18. Alpine é 10x menor. Para Go/Rust, considere scratch ou distroless. Fixe versão: node:18.19-alpine3.19.
- Otimize Layers: Agrupe comandos RUN:
RUN apk add git && npm install && apk del git. Limpe cache no mesmo layer:RUN npm ci && npm cache clean --force. - Multi-Stage Build: Stage 1: FROM node:18 AS builder, npm install com devDeps. Stage 2: FROM node:18-alpine, COPY --from=builder apenas dist/ e node_modules produção.
- Configure .dockerignore: Adicione: node_modules, .git, .env*, *.md, tests/, coverage/. Reduz context de GB pra MB. Build 5x mais rápido.
- Segurança: Crie user non-root:
RUN addgroup -g 1001 app && adduser -D -u 1001 -G app app,USER app. Scan vulnerabilidades:docker scan imagem.
Boas Praticas
Recomendacoes
• Use npm ci ao invés de npm install
• Não instale devDependencies em produção
• COPY package.json separado para cache de deps
• Use HEALTHCHECK para monitoramento
• Minimize número de layers (combine RUNs)
• Scan imagens com Trivy ou Snyk
Erros Comuns
Evite estes erros
• COPY . . logo no início (quebra cache)
• Rodar como root (user 0)
• Usar latest tag
• Incluir secrets no Dockerfile
• Não limpar cache de package managers
Checklist
- Imagem Alpine ou Distroless
- Multi-stage build implementado
- .dockerignore configurado
- User non-root criado
- Tamanho < 200MB
- Zero vulnerabilidades críticas