Sobes.tech
Middle

Como você usa a construção em múltiplas etapas (multistage) para otimizar as imagens Docker?

sobes.tech IA

Resposta da IA

A construção em múltiplas camadas permite usar várias etapas (layers) em um Dockerfile, onde cada etapa realiza sua própria tarefa. O resultado de uma etapa (por exemplo, um artefato compilado) é passado para a próxima, mas as camadas intermediárias das etapas anteriores não são incluídas na imagem final.

Exemplo de uso para compilar uma aplicação Go:

# Etapa de compilação
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o /app/myapp

# Etapa final
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp /app/
CMD ["/app/myapp"]

Vantagens:

  • Redução do tamanho da imagem: Na imagem final, apenas a aplicação compilada e suas dependências necessárias são incluídas, não as ferramentas de compilação, o código fonte ou arquivos intermediários.
  • Separação de preocupações: A lógica de compilação/desenvolvimento é separada da lógica de implantação.
  • Aumento da segurança: A superfície de ataque é reduzida ao excluir ferramentas e bibliotecas desnecessárias da imagem final.
  • Aceleração de compilação: O cache de camadas entre etapas pode acelerar recompilações.

Por exemplo, no Dockerfile fornecido, a primeira camada builder é usada para compilar a aplicação Go. A segunda camada, que começa com FROM alpine:latest, copia apenas a aplicação compilada da primeira camada (COPY --from=builder /app/myapp /app/) para uma imagem base limpa. Como resultado, a imagem final contém apenas o arquivo executável e o sistema operacional básico, sem o compilador Go e o código fonte.

Isso reduz significativamente o tamanho da imagem em comparação com a abordagem tradicional, onde a compilação e a execução ocorrem em um único contêiner.