Criar imagens Docker leves e seguras é uma tarefa essencial para desenvolvedores, engenheiros DevOps e todos que trabalham com contêineres. Quanto menor a imagem, mais rápido é seu processo de build, entrega e inicialização. Isso é especialmente crítico em ambientes de nuvem, pipelines CI/CD e arquiteturas de microsserviços escaláveis.
Neste artigo, vamos explorar por que reduzir imagens é importante, como fazer isso da maneira certa e quais ferramentas você deve considerar.
Por que é importante reduzir imagens Docker?
Uma imagem grande:
- Demora mais para ser baixada e iniciada
- Ocupa mais espaço de armazenamento
- Apresenta maior risco de vulnerabilidades (mais camadas e dependências)
- Dificulta o cache e os pipelines de CI/CD
1. Use imagens base mínimas
Sempre comece com a imagem base mais enxuta possível para sua stack:
Linguagem | Imagem mínima |
---|---|
Node.js | node:alpine |
Python | python:alpine |
Go | golang:alpine ou scratch |
Java | eclipse-temurin:<versão>-alpine |
Ubuntu | ubuntu:minimal ou debian:slim |
O Alpine Linux é uma distribuição ultraleve (~5MB) e funciona muito bem para a maioria dos aplicativos.
2. Remova tudo que for desnecessário após a instalação
Depois de instalar pacotes via apt, apk, pip, npm etc.:
- Remova arquivos temporários
- Limpe o cache dos gerenciadores de pacotes
Exemplo para sistemas baseados em Debian:
curl \
&& rm -rf /var/lib/apt/lists/*
3. Use multi-stage builds
Uma das formas mais poderosas de otimizar imagens é separar o estágio de build do de runtime.
Exemplo com Go:
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp
# Etapa de execução
FROM alpine
COPY --from=builder /app/myapp /myapp
ENTRYPOINT ["/myapp"]
Resultado: uma imagem limpa e mínima, sem dependências de compilação.
4. Use .dockerignore
O arquivo .dockerignore funciona como um .gitignore, excluindo arquivos desnecessários do contexto de build:
node_modules
__pycache__
*.log
*.md
tests/
Isso acelera o build e reduz o tamanho da imagem.
5. Use o docker-slim
A ferramenta docker-slim analisa automaticamente quais arquivos são realmente usados pelo seu app e cria uma imagem mínima.
Exemplo de uso:
docker-slim build myapp
Resultado: redução de 10 a 30 vezes no tamanho da imagem.
6. Combine comandos RUN
Cada comando RUN cria uma nova camada. Combine comandos com && para reduzir o número de camadas:
7. Minimize o uso de COPY e ADD
Evite múltiplos comandos COPY. Prefira um único:
E use ADD apenas se for necessário extrair arquivos de um .tar ou baixar conteúdo remoto — COPY é mais seguro e previsível.
8. Remova dependências não utilizadas
Se você usa Python, Node.js ou outra linguagem com gerenciadores de pacotes, adote práticas como:
- pip install --no-cache-dir
- npm prune --production
- poetry install --only main
Conclusão
Reduzir o tamanho das imagens Docker não é apenas uma questão de economizar megabytes, mas também de:
- Acelerar pipelines CI/CD
- Aumentar a segurança
- Reduzir custos de infraestrutura
Seguindo essas boas práticas e usando ferramentas como o docker-slim, você poderá criar imagens enxutas, rápidas e seguras — ideais para ambientes de produção.