goland连接docker容器调试必须配置dlv监听0.0.0.0:2345、宿主机映射端口2345、goland远程调试host填localhost,且goroot指向本地go路径;路径、goproxy、volume挂载需严格统一。

GoLand直接连Docker容器跑开发环境,不是“能用”,而是必须关掉go build的本地路径检查、必须让dlv在容器内监听localhost:2345、且docker run命令里不能漏掉-p 2345:2345——否则断点永远不命中。
GoLand远程调试前,容器里必须装好dlv且监听正确地址
很多人卡在“点了调试没反应”,根本原因是dlv没装,或装了但监听的是127.0.0.1:2345。容器内127.0.0.1只对容器自己有效,GoLand从宿主机连不进去。
- 在Dockerfile里加一行:
RUN go install github.com/go-delve/delve/cmd/dlv@latest - 启动容器时,用
dlv代替go run,并显式指定--headless --listen=:2345 --api-version=2 --accept-multiclient -
--listen=:2345中的冒号前空着,等价于0.0.0.0:2345,不是127.0.0.1:2345 - 如果用
docker-compose.yml,确保ports段包含- "2345:2345"
GoLand配置Remote Debug时,Host填localhost而非容器IP
哪怕容器是用docker run -d --name dev-go ...启动的,GoLand的Debug配置里Host字段也必须填localhost。因为Docker默认把端口映射到了宿主机网络栈,不是容器内部网络。
- GoLand的
Run → Edit Configurations → Go Remote中:Host:localhostPort:2345Working directory: 填你本地项目根路径(不是容器里的/app) - 别信某些文档说要填
docker inspect -f '{{.NetworkSettings.IPAddress}}' dev-go——那是旧版Docker桥接模式才需要的,现在基本不用 - 如果报
Connection refused,先在宿主机执行telnet localhost 2345,不通就说明容器没正确暴露端口或dlv没起来
代码热更新失败?检查volume挂载路径和WORKDIR是否一致
用docker run -v $(pwd):/app挂载代码,但Dockerfile里WORKDIR设成/src,结果GoLand编译时找的是/src/main.go,而实际文件在/app/main.go——路径错位导致修改不生效、go mod报错找不到模块。
- 统一路径:Dockerfile里
WORKDIR /app,docker run里-v $(pwd):/app - 如果项目用了
go.work或replace指令,确保go.work里的路径是相对路径,或在容器内用sed -i动态替换为/app - Mac/Windows用户注意:Docker Desktop默认只共享
/Users或C:\Users子目录,把项目放外面会导致volume挂载为空
多阶段构建镜像里,builder阶段的GOPROXY必须显式设置
用FROM golang:1.24-alpine AS builder时,go mod download会失败,报Get \"https://proxy.golang.org/...\": dial tcp: lookup proxy.golang.org on 127.0.0.11:53: read udp 127.0.0.1:57825->127.0.0.11:53: i/o timeout——这是Alpine默认DNS解析器在builder阶段不可靠。
- 在builder阶段开头加:
ENV GOPROXY=https://goproxy.cn,direct - 别依赖
.bashrc或~/.profile里的export,Docker构建过程不读这些文件 - 如果公司内网有私有代理,用
https://intra.example.com/goproxy,但必须确认该地址能被容器内wget或curl访问通
最常被忽略的一点:GoLand的File → Settings → Go → GOROOT要指向本地安装的Go路径,不是容器里的。它只负责语法检查和代码补全;真正编译和调试由容器承担,两者职责必须切开——混用会导致go version提示和实际运行版本不一致,尤其在CGO项目里会静默失败。











