0Pricing
Go Academy · 课时

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. Go 的多阶段 Docker 构建
  2. 环境配置与密钥
  3. 用于本地开发的 Docker Compose
  4. 健康检查与生产环境调优
← 返回 Go Academy