Go项目Docker多阶段构建的核心是分离编译与运行环境:第一阶段用golang:1.23-alpine静态编译(CGO_ENABLED=0 GOOS=linux GOARCH=amd64 -ldflags="-w -s"),第二阶段用alpine或scratch仅复制二进制,确保镜像轻量、安全、启动快。
Go 项目用 Docker 多阶段构建,核心就一件事:把编译环境和运行环境彻底分开。不是为了炫技,而是避免把 Go SDK、源码、测试文件、编译器全塞进生产镜像——那样动辄 800MB+,还带 root 权限和攻击面。
用 golang:1.23-alpine 这类轻量 SDK 镜像启动构建阶段,关键动作有:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags '-w -s' -o /app/server ./cmd/main
从 alpine:latest 或 scratch 启动新阶段,只拿上一阶段编译好的二进制:
/etc/resolv.conf 和基础 DNS 配置,HTTPS 请求默认可用(装 ca-certificates 即可)COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/)、补 /etc/passwd(避免 user.Current() 崩溃)、补 /dev/null 等基础设备节点光写对 Dockerfile 不够,得确认最终产物真能跑:
ldd ./server,输出 not a dynamic executable 才算过关x509 certificate signed by unknown authority,说明证书没拷对位置或没更新http.Get("https://api.example.com") 报 no such host,检查 /etc/resolv.conf 是否存在且有效不是必须,但上线前建议加上:
RUN addgroup -g 1001 -f appgroup && adduser -S appuser -u 1001,再 USER appuser
.git、vendor/、*.md、testdata/
DOCKER_BUILDKIT=1 docker build .,支持 --mount=type=cache 加速依赖缓存