Pular para o conteúdo
Tecnologia

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

  1. 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.
  2. 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.
  3. 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.
  4. Configure .dockerignore: Adicione: node_modules, .git, .env*, *.md, tests/, coverage/. Reduz context de GB pra MB. Build 5x mais rápido.
  5. 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