开发用分阶段Dockerfile+源码挂载+air热重载,生产用多阶段构建精简镜像;docker-compose统一编排依赖服务,通过服务名通信并内置重试机制。

用 Golang 配置 Docker 开发环境,核心是写好 Dockerfile、合理管理依赖、避免重复构建,并让本地开发与容器行为尽量一致。关键不在“能不能跑”,而在“是否高效、可复现、易调试”。
写一个适合开发的 Dockerfile(支持热重载)
生产镜像追求精简,但开发环境需要快速反馈。推荐分阶段构建 + 本地挂载源码:
- 基础镜像选
golang:1.22-alpine(轻量)或golang:1.22(兼容性更好) - 用
go mod download提前拉取依赖,利用 Docker 层缓存加速后续构建 - 不把源码 COPY 进镜像,改用
docker run -v $(pwd):/app -w /app挂载本地目录 - 装
air或reflex实现文件变更自动重启:go install github.com/cosmtrek/air@latest
用 docker-compose 管理多服务依赖
Go 应用常需连数据库、Redis 或其他 HTTP 服务。用 docker-compose.yml 统一编排比手动启停更可靠:
- 定义
app服务:基于你的 Go 镜像,挂载代码、暴露端口、设置启动命令为air - 定义
postgres、redis等服务,用depends_on控制启动顺序(注意:它不等就绪,应用内仍需加连接重试) - 通过服务名通信(如
postgres://postgres:5432),Docker 内置 DNS 自动解析
区分开发与生产构建流程
同一个项目,开发用挂载+热重载,上线要用静态二进制+最小镜像:
立即学习“go语言免费学习笔记(深入)”;
- 开发版 Dockerfile:以
golang镜像为基础,保留go工具链和air - 生产版 Dockerfile:用
multi-stage构建,第一阶段编译,第二阶段用scratch或alpine打包二进制,无 Go 环境、无源码、体积通常 - 用
.dockerignore排除go.mod外的无关文件(如node_modules、.git),避免误传敏感内容或拖慢构建
调试与日志要直连容器内部
别只靠 docker logs -f 看输出,遇到问题得进容器查:
- 运行中容器执行命令:
docker exec -it(Alpine 用sh sh,Debian 用bash) - 检查环境变量:
env | grep GO,确认GOPATH、GOBIN是否符合预期 - 验证网络连通性:
curl -v http://other-service:8080/health,确认服务发现和端口映射正常 - 日志建议结构化输出(如用
zerolog或log/slog),方便后续接入 ELK 或 Loki










