Go 的多阶段 Docker 构建
使用构建阶段,并以 scratch/alpine 作为最终镜像
Go 的多阶段 Docker 构建 是 CoddyKit 上的免费 Go Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Go Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Go Academy 课程共包含 4 节课。
为什么使用多阶段构建
编译 Go 代码的单阶段构建会生成包含完整 Go 工具链的大型镜像。多阶段构建在一个阶段进行编译,然后只将二进制文件复制到最小化的最终镜像中。
基本的多阶段 Dockerfile
构建阶段负责编译二进制文件;最终阶段将其复制到最小化的基础镜像中:
FROM golang:1.22-alpine AS build
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o myapp ./cmd/server
FROM scratch
COPY --from=build /app/myapp /myapp
COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
ENTRYPOINT ["/myapp"]FROM scratch
FROM scratch 镜像中什么都没有——没有命令行解释器,也没有操作系统库。Go 二进制文件必须进行静态链接(CGO_ENABLED=0),并显式包含所有必需的文件。
FROM distroless
Google 的 distroless 镜像提供最小化的操作系统库(CA 证书、时区数据),但不包含命令行解释器——对于需要 libc 或 TLS 证书的二进制文件来说,比 scratch 更安全。
FROM gcr.io/distroless/static-debian12
COPY --from=build /app/myapp /
ENTRYPOINT ["/myapp"]FROM alpine:用于命令行解释器
需要使用命令行解释器进行调试,或二进制文件使用 CGO 时,请将 Alpine 作为最终基础镜像。Alpine 会增加约 5MB 大小,但包含命令行解释器和包管理器。
go.mod 的层缓存
先复制 go.mod 和 go.sum,并在复制源代码之前运行 go mod download。依赖未发生变化之前,这一层都会保持缓存,从而加快重新构建速度。
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build ...-ldflags="-s -w"
-s 会移除符号表;-w 会移除 DWARF 调试信息。两者结合可在不影响运行时的情况下将二进制文件大小减少 30%–50%。
构建参数
使用 ARG 在构建时注入版本信息:
ARG VERSION=dev
RUN go build -ldflags="-X main.version=${VERSION}" -o myapp .非 root 用户
出于安全考虑,请以非 root 用户身份运行二进制文件。您可以在基础镜像中添加用户,或使用 distroless 的 nonroot 标签:
FROM gcr.io/distroless/static-debian12:nonroot最终镜像大小
使用 scratch 构建的典型 Go 二进制文件大小为 5–20 MB。Alpine 会增加约 5MB。完整的 golang 镜像约为 800MB。多阶段构建可以显著减小攻击面和镜像拉取时间。
.dockerignore
添加 .dockerignore 文件,以从构建上下文中排除以下文件:vendor/、.git/、*.test、*.prof。这可以加快 Docker 构建,并防止敏感文件被包含其中。
.git
vendor
*.test
*.prof
.env快速检查
为 FROM scratch Docker 镜像构建 Go 二进制文件时,为什么必须设置 CGO_ENABLED=0?
回顾:多阶段 Docker 构建
要点:
- 构建阶段使用 golang 镜像;最终阶段使用 scratch、distroless 或 alpine
- 使用 CGO_ENABLED=0 构建静态二进制文件(scratch 所必需)
- 先复制 go.mod 以利用层缓存;使用 -ldflags="-s -w" 减小二进制文件
- 使用 .dockerignore 排除 .git、vendor 和测试文件
常见问题解答
「Go 的多阶段 Docker 构建」课时是免费的吗?
是的 — 「Go 的多阶段 Docker 构建」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Go Academy 课程的其余内容,请升级到 CoddyKit PRO。 Go Academy 课程共包含 4 节课。
「Go 的多阶段 Docker 构建」这节课中我会学到什么?
使用构建阶段,并以 scratch/alpine 作为最终镜像 你通过在浏览器中直接运行的动手代码来练习 Go Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Go Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Go Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「Go 的多阶段 Docker 构建」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Go Academy 课中编写并运行代码吗?
能。每节 Go Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- Go 的多阶段 Docker 构建
- 环境配置与密钥
- 用于本地开发的 Docker Compose
- 健康检查与生产环境调优