go delve 远程调试不适用于 docker "network_mode: host"

go delve remote debugging does not work with docker "network_mode: host"

您好,我正在尝试 运行 在带有 VSCode 的 docker 容器中使用 dlv 进行远程调试。 当我指定 docker-compose 标志 network_mode: host 而不是特定端口时,问题就开始了(由于使用 MQTT,这是必需的)。这会导致 VSCode 抛出以下错误:“无法继续:”错误:连接 ENCONNREFUSED ...“”

.vscode/launch.json

{
"version": "0.2.0",
"configurations": [
    {
        "name": "Remote Docker",
        "type": "go",
        "request": "attach",
        "mode": "remote",
        "remotePath":"/go/src/work/cmd/mapper",
        "port": 2345,
        // "host": "127.0.0.1",
        "cwd": "${workspaceFolder}/src/cmd/mapper",
        "args": [],
        "trace" : "verbose",
        "env" : {}
    },
]
}

docker-compose.yml

version: "3.4"
services:
  golang:
    container_name: golang
    image: gotestdlv:latest
    privileged: true
    volumes:
      - ./src/:/go/src/work/
    network_mode: host
    # ports:
      # - 2345:2345 # debug port

它对您不起作用的原因可能有很多。其中有:

  • The host networking driver only works on Linux hosts,因此如果您将 Docker 用于 Mac,将 Docker 用于 Windows 或 Docker 企业版,则不会工作。
  • 端口 2345 可能已在您的计算机上使用,并且 delve 进程可能无法绑定它。
  • 您在连接到您的会话时可能使用了错误的主机名(您的代码片段显示 127.0.0.1 但它被注释掉了,我不知道它在未提供 IP 时选择了哪个 IP)。

我不确定您为什么要尝试使用主机网络模式,因为它通常对两个主要用例有用:当 docker 容器需要时使用它性能更高绑定大范围的端口(数百或数千个端口),并且在 运行 一个 Docker swarm 时会很方便,只要服务在 swarm 中没有冲突的端口。

在我看来,这些案例中的任何一个都与您描述的情况无关,所以即使这不是您最初的问题,我还是建议您寻找其他解决方案来解决问题您试图通过使用主机网络模式来解决。