首页/云/Docker 容器速查/Go 多阶段构建示例
镜像与构建107 条

Go 多阶段构建示例

Go 静态编译的典型流水线:构建阶段带工具链,运行阶段用 distroless/scratch;配合交叉编译参数产出目标架构二进制。

Docker 容器速查云更新于 2026-10-12

示例

示例
FROM --platform=$BUILDPLATFORM golang:1.23 AS build
ARG TARGETOS TARGETARCH
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=$TARGETOS GOARCH=$TARGETARCH go build -trimpath -ldflags='-s -w' -o /out/app .

FROM gcr.io/distroless/static-debian12:nonroot
COPY --from=build /out/app /app
ENTRYPOINT ["/app"]
先复制 go.mod/go.sum 再 go mod download:依赖层缓存不随源码变化重跑;-s -w 去掉符号信息减小体积。

易错点

  • 依赖 cgo 或 glibc 的库在 distroless/scratch 里缺少动态库会启动失败,静态编译或补基础镜像
  • CGO_ENABLED=0 时 net 包走纯 Go 解析,个别依赖 glibc NSS 的行为会变化

数据来源与参考

  • Docker 官方文档:Multi-stage builds(docs.docker.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌