如何将 VS Code 附加到 docker 容器中的节点进程 运行

How can I attach VS Code to a node process running in a docker container

我正在尝试将 Visual Studio 代码调试器附加到 node.js 应用程序,该应用程序 运行 正在 Docker 容器内。

我像这样启动应用程序:

node --debug-brk app.js

我在 docker-compose.yml:

中公开了调试器端口
app:
  build: .
  working_dir: /code
  volumes:
    - .:/code
  command: npm run debug
  ports:
    - "3004:3000"
    - "5858:5858"

我的 launch.json 看起来像:

{
    "version": "0.1.0",
    "configurations": [
        {
            "name": "Attach",
            "type": "node",
            "address": "localhost",
            "port": 5858
        }
    ]
}

现在,当我启动应用程序并附加调试器时,这将正确连接(我已经可以看到调试器中闪烁的值 UI),但随后它将停止,并告诉我以下内容:

Error opening 'app.js' (File not found: /code/app.js).

这是因为 docker 不会在 root 中而是在 /code 中挂载应用程序(参见 docker-compose.yml 中的 volumes)并且 VS 代码很混乱由于突然的偏移。

当我 运行 容器外的应用程序(即本地,无偏移)时,它按预期工作,我可以按预期使用调试器。

启动配置似乎有一个 cwd 选项,但我不确定这对我的情况是否有影响。

我可以修复这个路径偏移吗?我还漏掉了什么吗?

我认为你的调试器被欺骗了,因为你的应用程序路径在 docker 中是 /code 而在你的计算机上它是不同的东西。

可能类似于 /home/m90/code

所以当你的调试器试图在你的本地机器上查看你的代码时。它查看仅存在于 docker 内部的 /code。此路径在 docker.

之外没有任何意义

如果您可以告诉您的调试器在您机器上的正确位置(同样是在 docker 容器之外)查找您的代码,那将修复它。

另一种方法是在 docker 内外为您的代码设置相同的路径。

试试这个 docker-compose.yml 的修改版本。 (将 docker 中的 /code 目录复制到您的主机目录 /code)

docker-compose.yml

app:
  build: .
  working_dir: /code
  volumes:
    - /code:/code
  command: npm run debug
  ports:
    - "3004:3000"
    - "5858:5858"

只更改了一行:/code:/code 而不是 .:/code

您可以尝试将当前目录绑定挂载到 /code 以便 VS 可以在那里找到您的源代码:sudo mount --bind . /code

VSCode现已正式支持此功能:https://github.com/Microsoft/vscode-node-debug/issues/8

对我来说,直到我使用检查才起作用:node --inspect=5858 app.js