Builds Docker Multi-Stage para Go
Dockerfiles multi-stage compilam Go em uma imagem SDK completa, depois copiam apenas o binário (e as raízes de confiança necessárias) para um estágio de runtime mínimo.
Busque em todas as páginas da documentação
Dockerfiles multi-stage compilam Go em uma imagem SDK completa, depois copiam apenas o binário (e as raízes de confiança necessárias) para um estágio de runtime mínimo.
O resultado são imagens pequenas e de download rápido, com menos pacotes de SO para aplicar patches.
Binários estáticos do Go combinam naturalmente com runtimes distroless ou scratch.
Um pipeline típico usa um estágio de build golang, emite saída CGO_ENABLED=0 e copia o executável para gcr.io/distroless/static ou uma imagem scratch personalizada com certificados CA.
Clientes HTTPS precisam do pacote de certificados do sistema, a menos que você incorpore as raízes de outra forma.
Montagens de cache BuildKit para go mod download encurtam o tempo de CI sem inchar as camadas.
Cartão de receita de referência rápida - pronto para copiar e colar.
# syntax=docker/dockerfile:1
FROM golang:1.26-bookworm AS build
WORKDIR /src
COPY go.mod go.sum ./
RUN --mount=type=cache,target=/go/pkg/mod \
go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -trimpath \
-ldflags="-s -w" -o /out/api ./cmd/api
FROM gcr.io/distroless/static-debian12:nonroot
COPY --from=build /out/api /api
USER nonroot:nonroot
EXPOSE 8080
ENTRYPOINT ["/api"]Quando usar isso:
Dockerfile orientado para produção com certificados CA para TLS de saída:
# syntax=docker/dockerfile:1
FROM golang:1.26-bookworm AS build
WORKDIR /src
COPY go.mod go.sum ./
RUN --mount=type=cache,target=/go/pkg/mod \
go mod download
COPY . .
ARG VERSION=dev
ARG COMMIT=none
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -trimpath \
-ldflags="-s -w -X main.version=${VERSION} -X main.commit=${COMMIT}" \
-o /out/api ./cmd/api
FROM debian:bookworm-slim AS certs
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates \
&& update-ca-certificates
FROM gcr.io/distroless/base-debian12:nonroot
COPY --from=build /out/api /api
COPY --from=certs /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
USER nonroot:nonroot
EXPOSE 8080
ENTRYPOINT ["/api"]docker build \
--build-arg VERSION=1.0.0 \
--build-arg COMMIT=$(git rev-parse --short HEAD) \
-t myorg/api:1.0.0 .O que isso demonstra:
go mod em CI.certs dedicado copia apenas ca-certificates.crt para distroless.nonroot evita rodar como UID 0 dentro do contêiner.COPY --from= aparecem no histórico da imagem final.CGO_ENABLED=0 evita requisitos do carregador dinâmico glibc em Linux amd64/arm64.| Base | Shell | libc | Certificados CA | Tamanho Típico |
|---|---|---|---|---|
| scratch | Não | Não | Manual | O menor |
| distroless/static | Não | Não | Não | ~2 MB + binário |
| distroless/base | Não | Sim | Sim | ~20 MB + binário |
| alpine | Sim | musl | Sim | Maior, libc diferente |
# Verifique se o binário é estático antes de escolher scratch
CGO_ENABLED=0 go build -o api ./cmd/api
file api # espere "statically linked"
ldd api # espere "not a dynamic executable" no LinuxCGO_ENABLED=1; prefira construtores debian bookworm para cgo.-trimpath remove $PWD de binários para auditorias de cadeia de suprimentos.GOAMD64=v3 apenas quando você controlar a linha de base da CPU e quiser instruções SIMD mais recentes.RUN --mount=type=cache,target=/root/.cache/go-build \
CGO_ENABLED=0 go build -o /out/api ./cmd/apigolang:1.26-bookworm@sha256:....docker scout cves ou seu scanner no estágio final, não no construtor.ca-certificates.crt.CGO_ENABLED=0./usr/share/zoneinfo; defina TZ ou copie zoneinfo se os logs precisarem de hora local.kubectl exec em distroless; confie em logs, métricas e pods de depuração efêmeros com ferramentas.CAP_NET_BIND_SERVICE deliberadamente.Escolha scratch quando o binário não faz HTTPS de saída e precisa da menor imagem possível.
Escolha distroless/base quando você precisa de libc, comportamento do resolvedor DNS e certificados CA sem manter um layout scratch personalizado.
Execute apt-get install ca-certificates em um estágio debian descartável, depois COPY --from=certs /etc/ssl/certs/ca-certificates.crt para distroless.
Nunca execute apt no estágio de runtime.
Você pode estar marcando acidentalmente o estágio de build, ou copiando fixtures de teste e caches de build.
Inspecione com docker history myorg/api:tag e certifique-se de que a tag publicada aponte para o estágio final.
Raramente para microsserviços em nuvem.
UPX pode acionar falsos positivos de antivírus e adiciona custo de descompressão na inicialização.
Prefira -ldflags="-s -w" e grafos de dependência menores primeiro.
Escute na porta 8080 dentro do contêiner e deixe o Ingress mapear a porta 443/80.
Alternativamente, use uma configuração de capacidade rootless, mas portas altas são o padrão comum do Kubernetes.
Versões de Stack: Esta página foi escrita para Go 1.26.x (Green Tea GC padrão, go fix modernizers - verifique o patch na compilação), chi (latest - verifique na compilação), gin (latest - verifique na compilação), echo (latest - verifique na compilação), google.golang.org/grpc (latest - verifique na compilação), sigs.k8s.io/controller-runtime (latest - verifique na compilação), kubebuilder (latest - verifique na compilação), tinygo (latest - verifique os alvos de placa na compilação), wazero (latest - verifique na compilação) e golangci-lint (latest - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026