← Início
#125

Dockerfile Otimizado (Multi-Stage)

Código, Dev & Automação Intermediário Template
Objetivo

Criar Dockerfiles otimizados usando multi-stage builds - reduzindo o tamanho da imagem final, melhorando a segurança e acelerando builds - para containers leves, rápidos de deployar e seguros para produção.

Quando usar
  • Ao containerizar uma aplicação pela primeira vez
  • Quando a imagem Docker está grande demais (>500MB)
  • Para melhorar tempo de build e deploy
  • Na padronização de containers da equipe
Como usar
  • 1Copie o prompt abaixo no Claude ou ChatGPT
  • 2Descreva a stack, dependências e requisitos
  • 3Receba o Dockerfile otimizado com explicações
  • 4Teste localmente e integre no pipeline
O Prompt
Você é um engenheiro DevOps que cria Dockerfiles otimizados para produção. Seus princípios: (1) imagens pequenas - cada MB a mais é tempo de deploy desperdiçado, (2) multi-stage builds - separar build de runtime, (3) segurança - nunca rodar como root, (4) cache inteligente - ordenar layers para maximizar cache hits, (5) reproducibilidade - builds devem ser idênticos em qualquer máquina. Crie o Dockerfile otimizado para: **Aplicação:** [tipo - API, web app, worker, cron job] **Stack:** [ex: Node.js 20, Python 3.12, Go 1.22, Java 21] **Framework:** [ex: Express, FastAPI, Gin, Spring Boot] **Gerenciador de pacotes:** [npm, yarn, pnpm, pip, poetry, go modules] **Build command:** [ex: npm run build, go build, mvn package] **Porta:** [ex: 3000, 8080, 8000] **Dependências de sistema:** [ex: imagemagick, ffmpeg, sharp, pg_client] **Arquivos estáticos:** [serve estáticos? precisa de nginx?] **Variáveis de ambiente:** [em runtime - não hardcodar] **Health check:** [endpoint ou comando para verificar saúde] Entregue: **1. Dockerfile otimizado (multi-stage)** com 3 stages: deps, build, runtime **2. .dockerignore** completo **3. Comparação de tamanho** antes vs depois **4. Boas práticas aplicadas** (checklist) **5. docker-compose.yml** para desenvolvimento **6. Comandos úteis** para build, run, debug
Exemplo de uso
Input
Aplicação: API REST Stack: Node.js 20, TypeScript Framework: Express Pacotes: npm Build: npm run build (tsc → dist/) Porta: 3000 Health check: GET /health
Output
# Stage 1: Dependências FROM node:20-alpine AS deps WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci --only=production && \ cp -R node_modules /prod_modules && \ npm ci # Stage 2: Build FROM node:20-alpine AS build WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY . . RUN npm run build # Stage 3: Runtime (imagem final) FROM node:20-alpine AS runtime WORKDIR /app RUN addgroup -g 1001 -S appgroup && \ adduser -S appuser -u 1001 -G appgroup COPY --from=deps /prod_modules ./node_modules COPY --from=build /app/dist ./dist COPY package.json ./ ENV NODE_ENV=production EXPOSE 3000 USER appuser HEALTHCHECK --interval=30s --timeout=3s --start-period=5s \ CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1 CMD ["node", "dist/index.js"] # Tamanho: ~180MB (naïve) → ~85MB (otimizado) - redução de 53%