根本原因是默认调试配置未暴露或转发调试端口,导致goland无法连接容器内dlv;必须显式映射2345端口、dlv监听0.0.0.0:2345、goland remote debug配置host为localhost且port为2345。

为什么 GoLand 调试容器内 Go 程序总卡在“Connecting”
根本原因是默认调试配置没走端口转发或未暴露调试端口。GoLand 的 Delve 调试器需要直接连接到容器内运行的 dlv 进程,而 Docker 默认网络隔离会让 localhost:2345 在宿主机上无法访问容器内部的调试服务。
必须显式暴露调试端口并启用端口映射,同时确保容器内 dlv 以 --headless --continue --accept-multiclient --api-version=2 模式启动,并监听 0.0.0.0:2345(而非 127.0.0.1:2345)。
- 在
Dockerfile的运行阶段添加EXPOSE 2345 -
docker run或docker-compose.yml中必须有-p 2345:2345映射 - 启动命令不能用
dlv exec ./myapp,得用dlv exec --headless --addr=0.0.0.0:2345 --api-version=2 ./myapp - GoLand 的 Remote Debug 配置中 Host 填
localhost,Port 填2345,不要勾选 “Use module SDK”
如何让 GoLand 自动 attach 到正在运行的容器进程
GoLand 本身不支持自动发现并 attach 容器内进程,但可通过组合命令 + 自定义 Run Configuration 实现半自动化。关键不是“自动”,而是复用调试配置、避免每次手动填地址。
核心思路是:用 docker ps 提取目标容器 ID 和 IP,再用 docker inspect 查出其桥接网络下的实际 IP(对 host 网络模式则直接用 localhost),最后触发 GoLand 的 Attach to Process 流程。
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
- 先在容器启动时加
-e "DLV_PORT=2345"和--network=host(开发机单测推荐) - 在 GoLand 中新建 “Attach to Process” 配置,Host 填
localhost,Port 填2345,Process name 填dlv - 若用 bridge 网络,需改 Host 为容器实际 IP:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_id></container_id> - 调试前确保容器内
dlv已启动且未退出(建议用sleep infinity托底)
调试多 stage 构建镜像时找不到源码怎么办
多阶段构建后,最终镜像里没有 Go 源码,Delve attach 后显示 “Source not found”。这不是 GoLand 的问题,而是镜像缺失调试符号和路径映射信息。
解决方向不是往生产镜像塞源码(违反安全原则),而是在构建时保留符号路径、并在 GoLand 中配置源码映射(Source Map)。
- 编译时加
-gcflags="all=-N -l"禁用优化并保留行号信息(仅限 debug 镜像) - 用
go build -o main -ldflags="-X main.version=$(git describe)" ./cmd/...保持版本可追溯 - 在 GoLand 的 Run Configuration → Debugger → “Sources” 标签页中,点击 “+” 添加本地项目根目录,并设置 Remote path 为
/app(即容器内 WORKDIR) - 若用 distroless 镜像,
dlv必须从 builder 阶段 COPY 过来,且版本要与宿主机dlv兼容(建议统一用dlv@latest)
CI 构建的镜像能否直接用于 GoLand 调试
通常不能,除非你明确为 CI 流水线构建了 debug 变体镜像。CI 默认产出的是 stripped、static、无调试依赖的生产镜像 —— 它连 /bin/sh 都没有,更别说 dlv。
正确做法是:在 CI 中区分 build-prod 和 build-debug 两个 job,后者启用调试标志并包含 dlv,打上 :debug 标签推送到 registry。
- Debug 镜像基础层必须含 glibc 或 musl(alpine 需
apk add --no-cache delve) - 禁止在 production Dockerfile 中
RUN apk add delve—— 这会污染镜像、增大体积、引入漏洞 - CI 中用
buildx构建多平台 debug 镜像时,注意dlv的架构匹配(如linux/arm64需对应二进制) - GoLand 连接前,先
docker run -it --rm -p 2345:2345 your-app:debug手动验证 dlv 是否响应
readinessProbe 若也指向 :2345,会导致探针误判调试服务为就绪状态,进而触发流量导入 —— 此时 dlv 正在等待 IDE 连接,请求会 hang 住。务必拆开:HTTP 服务走 8080,pprof 走 6060,dlv 固定用 2345,三者隔离。










