GoLand连接容器调试需确保三件事对齐:宿主机docker命令可用且用户加入docker组;容器内sshd监听0.0.0.0:22;GOROOT保持为空。SSH配置须暴露端口、密钥权限严格(600/700)、sshd_config启用认证,Path mappings必须映射容器与宿主机项目路径。

GoLand 本身不运行在容器里,它必须装在宿主机(macOS/Windows/Linux)上;所谓“容器外搭建”,实际是指:宿主机装 GoLand,容器里跑 Go 环境,两者通过 SSH 或 Docker 插件通信。关键不是“在容器外装 GoLand”,而是“怎么让 GoLand 正确连接并控制容器内的 Go 工具链”。
GoLand 连接容器前必须确认的三件事
很多配置失败,根源是这三项没对齐:
-
docker命令在宿主机终端能执行(which docker有输出),且用户已加入docker用户组(Linux/macOS)或 Docker Desktop 正在运行(Windows/macOS) - 容器内必须运行
sshd服务(不是只装openssh-server,还要service ssh start或用supervisord托管),且监听0.0.0.0:22(不能只监听127.0.0.1) - GoLand 的
Settings > Go > GOROOT保持为空或指向宿主机路径——它不负责编译,所有go build、go test都由容器内执行,GoLand 只转发命令和接收结果
SSH 配置最容易卡住的两个点
GoLand 用 SSH 连容器调试时,不是连 Docker daemon,而是连容器里跑的 sshd。常见断连原因:
- 容器启动时没暴露 SSH 端口:
docker run -p 2222:22(宿主机 2222 → 容器 22),漏掉-p就连不上 - SSH 密钥权限太开放:
~/.ssh/id_rsa必须是600,~/.ssh必须是700,否则 OpenSSH 拒绝读取,GoLand 报错Permission denied (publickey) - 容器内
/etc/ssh/sshd_config没开PasswordAuthentication yes(如果不用密钥)或没设PermitRootLogin yes(若用 root 登录)
GoLand 的 Remote Host Configuration 怎么填
这不是填 Docker daemon 地址,而是填容器的 SSH 连接信息:
-
Host:填
localhost(如果docker run -p 2222:22)或容器所在宿主机 IP(如果是远程服务器上的容器) -
Port:填映射后的端口,比如
2222,不是容器里的22 -
Username:填容器内存在的用户,如
root或你adduser创建的普通用户 -
Auth type:选
Key pair,然后指定私钥路径;如果选Password,密码必须是容器内该用户的实际密码(不是 Docker login 密码) -
Path mappings:关键!左侧填容器内路径(如
/app),右侧填宿主机项目路径(如/Users/you/project),否则 GoLand 找不到源码位置,断点不生效
为什么不用 Docker Compose 直连?
GoLand 官方支持的是 docker-compose up 启动的服务,但前提是服务容器里得有 sshd。单纯用 docker-compose.yml 定义一个 golang:alpine 服务,不配 SSH,GoLand 是无法调试的——它不支持直接 attach 到 go run 进程。必须显式暴露 SSH 端口、启动 SSH 服务、配置好用户权限,才能被识别为可调试的 remote host。


















