Multi-stage build позволяет использовать несколько образов в одном Dockerfile: один этап для сборки (компилятор, зависимости), другой - только для рантайма. В итоговый образ попадает только бинарник и минимальный окружение.
FROM golang:1.21
WORKDIR /app
COPY . .
RUN go build -o myapp .
CMD ["./myapp"]
# Итог: образ ~1 ГБ (вся Go-тулчейн и исходники)
FROM golang:1.21 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o myapp .
FROM alpine:3.19
RUN apk --no-cache add ca-certificates
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]
# Итог: образ ~15 МБ
Этап builder отбрасывается; в финальный образ копируется только бинарник. Меньший образ - быстрее деплой и меньше поверхность атак.