Multi-stage build é a técnica mais impactante para otimizar imagens Docker. Aprenda a separar build de produção e reduzir tamanho em até 90%.
Conceitos Principais
Múltiplos FROM
Cada FROM inicia novo stage. Stage anterior não vai para imagem final. Apenas última stage vira imagem. Pode nomear stages com AS.
COPY --from
Copia arquivos entre stages. COPY --from=builder /app/dist ./dist. Pega apenas o necessário do build stage.
Build Stage
Instala tudo: devDependencies, build tools, compiladores. Gera artefatos (dist/, bundle.js). Descartado na imagem final.
Runtime Stage
Imagem limpa, só produção. Apenas runtime, código compilado, prod dependencies. 90% menor que build stage.
Passo a Passo
- Stage de Build: FROM node:18 AS builder. WORKDIR /app. COPY package*. RUN npm install (com devDeps). COPY código. RUN npm run build.
- Stage de Produção: FROM node:18-alpine. WORKDIR /app. COPY package*. RUN npm ci --only=production. COPY --from=builder /app/dist ./dist.
- React Multi-Stage: Stage 1: build React (npm run build). Stage 2: FROM nginx:alpine, COPY --from=builder /app/build /usr/share/nginx/html. Imagem final: Nginx + static files.
- Go Multi-Stage: Stage 1: FROM golang:1.21, build binário. Stage 2: FROM alpine ou scratch, COPY apenas binário. Imagem de 5MB vs 800MB.
- Debug Stages: Build stage específico:
docker build --target builder -t app:debug .. Útil para testar build sem runtime stage.
Boas Praticas
Recomendacoes
• Nomeie stages significativamente (builder, deps, runtime)
• Use imagem maior no build, Alpine no runtime
• Compartilhe layers comuns entre stages
• Considere stage intermediário para deps
Erros Comuns
Evite estes erros
• Copiar node_modules do builder (reinstale no runtime)
• Usar mesma imagem nos dois stages
• Não aproveitar cache entre stages
Checklist
- Build stage com todas dev deps
- Runtime stage com Alpine
- Apenas artefatos copiados
- Imagem final < 200MB
- Build funciona localmente