Multi-stage builds são a técnica mais eficaz para reduzir o tamanho de imagens Docker. A ideia é simples: compilar em um container com todas as dependências e copiar apenas o binário final para uma imagem mínima.
O Problema
Um Dockerfile típico para Go:
# ❌ Imagem final: ~950MB
FROM golang:1.22
WORKDIR /app
COPY . .
RUN go build -o app .
CMD ["./app"]
A Solução
# ✅ Estágio 1: Build
FROM golang:1.22 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o app .
# ✅ Estágio 2: Runtime (~10MB)
FROM alpine:3.19
RUN apk add --no-cache ca-certificates
COPY --from=builder /app/app /usr/local/bin/app
USER 1000:1000
CMD ["app"]
Resultado
| Abordagem | Tamanho |
|---|---|
golang:1.22 direto | ~950 MB |
| Multi-stage + alpine | ~10 MB |
| Multi-stage + scratch | ~6 MB |
95% de redução. Simples, eficaz e seguro.