推荐直接复用golang:1.22-alpine镜像,通过volumes挂载项目目录和vendor、设置working_dir为/app、绑定0.0.0.0:8080、启用stdin_open/tty、用reflex实现热重载、暴露2345端口并配置Delve调试。

用 docker-compose.yml 定义 Go 编译与运行环境
本地开发不需要镜像长期驻留,重点是快速启动、支持热重载、能访问宿主机代码。直接复用 golang:1.22-alpine 基础镜像即可,避免自己写 Dockerfile 增加维护成本。
关键配置点:
-
volumes必须挂载当前项目目录(如./:/app),否则容器内看不到源码 -
working_dir: /app要显式设置,否则go run可能因路径错乱报no Go files in current directory - 别映射
8080:8080后再用localhost:8080测试——Go 服务默认绑定127.0.0.1:8080,容器内127.0.0.1指向自身,必须改成0.0.0.0:8080 - 加
stdin_open: true和tty: true,否则go run交互式输入会卡住
支持 go mod vendor 与本地依赖隔离
Go 模块依赖若混用宿主机 go.mod 和容器内缓存,容易出现 cannot find module providing package。最稳做法是把 vendor/ 目录也挂进容器,并在启动时强制启用 vendor 模式。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 先在宿主机执行
go mod vendor生成vendor/目录 - 在
docker-compose.yml的volumes中增加一行:./vendor:/app/vendor:ro - 启动命令改用
go run -mod=vendor main.go,避免容器内 GOPATH 或 GOCACHE 干扰 - 不推荐挂载
$HOME/go/pkg到容器——不同 Go 版本的缓存不兼容,反而引发invalid module cache
用 nodemon + reflex 实现 Go 文件变更自动重启
Docker Compose 本身不监听文件变化,得靠工具触发重建。Go 生态里 reflex 比 nodemon 更轻量、无 Node.js 依赖,适合嵌入容器。
步骤如下:
- 在
Dockerfile(或直接用command)安装reflex:apk add --no-cache reflex -
command改为:reflex -r "\\.go$" -- sh -c "go run -mod=vendor main.go" - 注意
-r后面的正则要加引号,否则 shell 在 compose 解析阶段就展开失败 - 如果遇到
reflex: command not found,检查是否在alpine镜像中用了apk add而非go install(后者需配GOPATH,易出错)
调试端口与 Delve 调试器集成
想用 VS Code 远程调试容器内 Go 程序,必须暴露 Delve 的调试端口(默认 2345),且 Delve 启动参数不能绑定到 127.0.0.1。
关键项:
- 在
docker-compose.yml加ports: ["2345:2345"] - Delve 启动命令必须含
--headless --continue --accept-multiclient --api-version=2 --addr=0.0.0.0:2345 - VS Code 的
launch.json中port填2345,host填localhost(不是容器名) - 别在容器里用
dlv dap模式——它需要额外的 WebSocket 端口,Docker Compose 端口映射不支持动态端口分配
网络模式用默认 bridge 就够,不需要 network_mode: host;后者会让容器共享宿主机网络栈,反而干扰本地调试端口冲突判断。










