Ao desenvolver aplicações modernas, especialmente aquelas que serão distribuídas em ambientes baseados em contêineres, como o Docker, é fundamental garantir que a imagem gerada seja leve, segura, eficiente e fácil de manter. Imagens grandes e cheias de dependências desnecessárias não apenas consomem mais espaço e largura de banda, mas também aumentam o tempo de build, dificultam o deploy e podem expor vulnerabilidades. Para lidar com esse desafio, uma técnica poderosa e elegante é o Multi-stage build — um recurso nativo do Docker que permite organizar o processo de construção da imagem em várias etapas, isolando fases como compilação, testes e empacotamento. Neste artigo, vamos entender em detalhes o que é o Multi-stage build, por que ele é tão útil, e como utilizá-lo de forma eficaz no seu fluxo de desenvolvimento.
Por que usar Multi-stage build?
Durante o processo de criação de uma imagem Docker, é comum precisar instalar várias dependências, ferramentas de compilação e bibliotecas. No entanto, essas ferramentas não são necessárias na imagem final, e sua presença pode:
- Aumentar o tamanho da imagem,
- Introduzir vulnerabilidades de segurança,
- Complicar a manutenção do ambiente.
Com o Multi-stage build, é possível dividir o processo de construção da aplicação em várias etapas, mantendo na imagem final apenas o que é essencial para execução.
Como funciona?
Um Dockerfile com Multi-stage build utiliza múltiplas instruções FROM, cada uma iniciando um novo estágio de construção. É possível copiar arquivos entre os estágios — por exemplo, copiar um binário compilado da primeira etapa para a última.
Exemplo prático
Vamos ver um exemplo com uma aplicação em Go:
FROM golang:1.21 as builder
WORKDIR /app
COPY . .
RUN go build -o myapp
# Etapa 2: imagem final
FROM debian:bullseye-slim
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]
Neste exemplo:
- A primeira etapa utiliza uma imagem com o compilador Go para gerar o binário.
- A segunda etapa usa uma imagem mínima (debian:slim) e inclui apenas o binário final.
Vantagens:
- Imagem menor — sem compilador ou código-fonte.
- Mais segura — menos componentes, menor superfície de ataque.
- Mais rápida para transferir e executar.
Recursos avançados
- É possível criar várias etapas intermediárias (por exemplo, para testes ou documentação).
- Cada etapa pode ter um nome (as builder) para facilitar a referência.
- Com o comando --target, é possível construir apenas até uma etapa específica — útil para depuração.
Conclusão
O Multi-stage build é uma técnica essencial para qualquer desenvolvedor ou DevOps que utiliza Docker. Ele permite criar imagens mais limpas, leves e seguras. Se você ainda não adotou essa abordagem nos seus projetos, vale muito a pena começar agora.