Pular para o conteúdo
Tecnologia

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

  1. Stage de Build: FROM node:18 AS builder. WORKDIR /app. COPY package*. RUN npm install (com devDeps). COPY código. RUN npm run build.
  2. Stage de Produção: FROM node:18-alpine. WORKDIR /app. COPY package*. RUN npm ci --only=production. COPY --from=builder /app/dist ./dist.
  3. 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.
  4. 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.
  5. 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