根本原因是dlv默认只监听127.0.0.1,需显式指定--listen=:2345;docker端口映射要正确(-p 2345:2345),goland中host按系统填localhost或host.docker.internal,port填2345,并配置--api-version=2、--wd和正确挂载路径。

GoLand 连不上容器里的 dlv,端口映射对了也不行?
常见现象是 GoLand 显示 “Connection refused” 或卡在 “Connecting to debugger…”。根本原因不是端口没开,而是 dlv 启动时没监听所有网络接口。
-
dlv默认只绑定127.0.0.1,容器内127.0.0.1是它自己,GoLand 在宿主机连不到 - 必须显式加
--headless --listen=:2345(注意是:2345,不是127.0.0.1:2345) - Docker run 时得加
-p 2345:2345,且容器内不能有防火墙(如 Alpine 的iptables默认不拦,但某些定制镜像会) - 如果用
docker-compose.yml,确认ports是"2345:2345",不是2345单值(后者只暴露不映射)
GoLand 里 Remote Debug 配置填什么?Host 别写 localhost
宿主机上 Docker 容器的 IP 不等于 localhost,尤其 macOS/Windows 用 Docker Desktop 时,localhost 指的是 Docker VM 的 localhost,不是容器网络。
- Mac/Linux:直接填
localhost可以(Docker for Mac/WSL2 已做端口转发) - Windows(非 WSL2):填
host.docker.internal,这是 Docker Desktop 提供的宿主机别名 - GoLand 的
Port填2345(和dlv --listen一致) - 不要勾选
Use module SDK,远程调试用不到本地 SDK 路径
容器里跑 dlv,为什么一断点就卡死或崩溃?
本质是 Go 程序被 dlv 注入后行为变化,加上容器环境限制,容易触发竞态或信号拦截失败。
- 启动命令必须加
--api-version=2(GoLand 当前依赖 v2 API,v1 已弃用) - 避免在
CGO_ENABLED=0下调试 cgo 代码;反之,若用了 cgo,容器里得装gcc和头文件(如libc6-dev) - 如果程序带
os/exec启子进程,确认容器有clone权限(docker run --cap-add=SYS_PTRACE必须加) - Alpine 镜像慎用 ——
dlv官方二进制不保证兼容 musl,优先用golang:slim(Debian base)
调试时看不到源码,GoLand 提示 “Source code not found”
不是路径问题,是 dlv 启动时没把源码路径正确暴露给调试器。
- 容器内运行
dlv的工作目录,必须和宿主机上 GoLand 打开的项目根目录结构一致(比如都从/app开始) - 启动命令加
--wd=/app(指定工作目录),并确保docker run -v $(pwd):/app挂载正确 - GoLand 的
Remote debug configuration中,Working directory填你本地项目路径,不是容器路径 - 如果用了 Go Modules,确认容器内
GO111MODULE=on且go.mod在挂载路径下










