GoLand调试Docker容器内Go程序失败的根本原因是网络不通,必须配置dlv监听0.0.0.0:2345、宿主机映射-p 2345:2345、GoLand Remote Debug中Host填localhost且Port填2345,并在Settings中正确添加Docker Compose为Go SDK。

GoLand 能直接把 docker-compose.yml 当作 Go SDK 来用,但配错位置、少写一个健康检查或端口没映射,调试就卡在 “Connecting” 或报 “connection refused”——不是 IDE 不行,而是容器没准备好。
GoLand 的 Docker Compose 解释器必须在 Go SDK 里配
它不生效的最常见原因:你在 Run Configuration 里选了服务,却没在 Settings → Languages & Frameworks → Go → Go SDK 页面点击右侧 Add SDK → Docker Compose。这个路径是唯一入口,其他地方选的服务只是“运行时引用”,不会触发容器拉起。
-
docker-compose.yml路径填相对路径(如./docker-compose.yml),不能用~/开头 - 服务名必须和
services:下的 key 完全一致,比如api:就填api,大小写、空格都不能错 - GoLand 会自动挂载当前项目目录,但若你的
go.mod里有replace ../shared,就得手动在volumes里补上对应路径
容器内 dlv 必须监听 0.0.0.0:2345,且宿主机要映射端口
默认的 golang:alpine 镜像不含 dlv,也不暴露 2345 端口。GoLand 连不上,根本原因是网络不通,不是配置漏项。
- Dockerfile 里加:
RUN go install github.com/go-delve/delve/cmd/dlv@latest - 启动命令必须用:
dlv exec --headless --addr=0.0.0.0:2345 --api-version=2 --accept-multiclient ./myapp(注意是0.0.0.0,不是127.0.0.1) -
docker-compose.yml的 service 下必须有:ports: ["2345:2345"] - GoLand 的 Remote Debug 配置中:
Host填localhost,Port填2345;别勾选 “Use module SDK”
depends_on 不等于服务就绪,数据库连不上得靠 healthcheck + 重试
depends_on 只控制容器启动顺序,不等 PostgreSQL 真监听 5432。Go 服务一启动就 dial,90% 概率失败。
Docker Hub (hub.docker.com)。此技能适用于所有 Docker Hub 操作,包括读取、创建、更新和删除数据。只要任务涉及 Docker Hub,就使用此技能。
- 给 db 服务加
healthcheck,例如:test: ["CMD-SHELL", "pg_isready -U postgres"] - Go 代码里别用
time.Sleep(5 * time.Second)硬等,改用net.DialTimeout循环探测 - Run Configuration 里必须勾选
Include services defined in docker-compose.yml,否则 GoLand 不会执行docker compose up
源码路径错位会导致热更新失效或断点不命中
volume 挂载路径和容器内 WORKDIR 不一致,是本地改了代码但容器里跑的还是旧文件的主因。
- Dockerfile 中设
WORKDIR /app,docker run或compose里用volumes: ["./:/app"],保持一致 - Mac/Windows 用户注意:Docker Desktop 默认只共享
/Users或C:\Users子目录,项目放别处会挂载为空 - 多阶段构建镜像里,如果最终镜像没源码,Delve attach 后显示 “Source not found”,这不是 GoLand 的问题,而是构建时没保留符号路径映射
真正难的不是配通,而是让容器里的进程状态、网络可达性、路径一致性全部对齐——这些细节一旦错位,现象就是“点了调试没反应”,但错误日志里往往什么都没有。










