Middle
Em que casos é utilizada uma compilação multi-estágio?
sobes.tech IA
Resposta da IA
A construção multi-stage (multi-stage build) no Docker é utilizada nos seguintes casos:
- Redução do tamanho da imagem final: Na primeira (ou intermédia) camada de construção encontram-se as ferramentas necessárias para compilar, testar ou outras etapas de construção (por exemplo, compilador, dependências de construção). Na segunda (final), apenas são copiados os artefactos necessários para executar a aplicação (código compilado, ficheiros executáveis, bibliotecas de tempo de execução). Isto evita incluir na imagem final dependências e ferramentas de construção desnecessárias, reduzindo significativamente o seu tamanho.
- Separação de etapas de construção e execução: A separação clara facilita a compreensão do processo de construção e a sua depuração. Pode-se ter etapas para compilar o código fonte, executar testes, fazer linting e só depois criar a imagem final com a aplicação pronta a ser implementada.
- Melhoria da segurança: A imagem final contém o mínimo necessário de componentes, o que reduz a superfície de ataque. As ferramentas de construção e o código fonte, que podem conter vulnerabilidades, não entram na imagem usada em produção.
- Aceleração da construção (em alguns casos): As imagens intermédias podem ser cacheadas, e ao fazer alterações apenas nas últimas etapas de construção, não é necessário reconstruir tudo do zero.
- Unificação do processo de construção: A construção da aplicação e a criação da sua imagem Docker tornam-se num processo automatizado único dentro de um Dockerfile, o que simplifica os pipelines de CI/CD.
Exemplo de uso para uma aplicação em Go:
# Etapa de construção
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
# Compilação do ficheiro executável
RUN go build -ldflags="-s -w" -o myapp .
# Etapa final
FROM alpine:latest
WORKDIR /app
# Copiamos apenas o ficheiro executável da etapa anterior
COPY --from=builder /app/myapp .
# Especificamos o comando para executar a aplicação
CMD ["./myapp"]