Go项目Docker搭建核心是多阶段构建:构建阶段用golang镜像编译,运行阶段用alpine或scratch仅复制二进制文件,并通过CGO_ENABLED=0、go build -ldflags="-s -w"减小体积,COPY --from=builder复制产物,EXPOSE和CMD配置运行。

Go 项目 Docker 搭建核心就三件事:写对 Dockerfile、管好依赖和环境、构建运行不踩坑。
Dockerfile 必须用多阶段构建
单阶段打包会把 Go 编译器、源码、测试文件全塞进生产镜像,体积大、风险高。标准做法分两步:
- 构建阶段用
golang:1.21-alpine(或你项目兼容的版本)下载依赖、编译二进制 - 运行阶段用
alpine:latest或scratch,只复制编译好的可执行文件
关键指令不能少:
-
CGO_ENABLED=0 GOOS=linux go build -a -ldflags="-s -w" -o server ./cmd/server
(禁用 cgo、指定 Linux 平台、剥离调试信息、减小体积) -
COPY --from=builder /app/server . -
EXPOSE 8080(按你实际监听端口改) CMD ["./server"]
依赖和配置要提前分离
别等构建时才 go mod download。在 Dockerfile 里先 COPY go.mod 和 go.sum,再 RUN go mod download —— 这样能利用 Docker 层缓存,改代码不重下依赖。
配置文件(如 config.yaml)不要硬编码进镜像。用 -v 挂载或通过环境变量注入,比如:
docker run -e LOG_LEVEL=info -e DATABASE_URL=postgres://... -p 8080:8080 myapp
本地验证和基础命令要熟
构建:docker build -t my-go-app .(注意末尾的点)
运行:docker run -p 8080:8080 --rm my-go-app(加 --rm 便于调试)
查日志:docker logs -f <container-id>
进容器看文件:docker exec -it <container-id> sh(alpine 用 sh,不是 bash)
额外两个建议
- 根目录加
.dockerignore,排除vendor/、.git、testdata/、README.md等无关文件 - 镜像运行用户别用 root:
RUN adduser -D appuser && USER appuser,提升安全性
不复杂但容易忽略。


















