从 docker 容器调试节点 (>=6.3)

Posted

技术标签:

【中文标题】从 docker 容器调试节点 (>=6.3)【英文标题】:Debug Node (>=6.3) from a docker container 【发布时间】:2017-09-20 03:46:36 【问题描述】:

我有一个 docker 容器,它使用 pm2 来运行节点,如下所示:

#process.yml
apps:

  - script: ./index.js
    name: client
    watch: true
    args: --inspect

 #Dockerfile

 CMD pm2-docker process.yml

正如我在that post 中看到的那样:节点检查器已到达 node.js 的核心并运行如下脚本:

node --inspect <somescript.js>

在命令行上提供一些输出,如下所示:chrome-devtools://… 并在 chrome 中导航到该 url,将启动节点检查器。

如何为位于容器内但应从主机调试的节点实例执行此操作。

更新

我可以通过改变两件事来启动调试过程:

    node_args: --inspect=localhost:9080 docker run ... -p 9080:9080

但这带来了一个问题:在执行node --inspect=... ... 之后,要使用的 URL 会立即显示在命令行上,但是在运行 docker 容器时,该信息会下降到某处的日志中。那么如何从那里访问 url?

【问题讨论】:

我不会在 docker 上使用 pm2,因为 docker 本身就有这些特性 那么你会用什么来代替呢?现在我为该容器提供了三个节点进程,它们都应该运行。 可以启动/停止/重启一个正常的容器,可以查看日志和统计信息,容器可以在失败时自动重启,并且可以进行健康检查。 Docker Swarm 可以通过前面的负载均衡器进行扩展(多次启动同一个镜像)并进行零停机更新。在我的选择中,docker 具有 pm2 的所有功能,如果您仍然使用 docker,它会更适合 【参考方案1】:

您只需使用 -p 9229:9229 或

发布所需的内容
ports: 
  - 9229:9229

在 docker-compose 中,然后使用 pm2 和 --inspect arg 或直接使用 node --inspect index 启动它。 然后将打印出 url,您可以像没有 docker 一样在 chrome 中简单地使用它。

以后要找到该行,您可以使用

docker-compose logs service-name | grep chrome-devtools

docker logs container-id 2>&1 | grep chrome-devtools

【讨论】:

以上是关于从 docker 容器调试节点 (>=6.3)的主要内容,如果未能解决你的问题,请参考以下文章

从docker容器内的节点服务器访问ubuntu localhost

节点Webpack挂起。如何调试?

Chrome 无法从 docker 容器内的调试端口提供服务

docker-compose 用于将 VS Code 中的 node.js 调试器附加到 WSL docker 中的节点进程

在 Docker 中远程调试节点应用程序

从 Docker 容器内部使用 XDebug 进行远程调试不起作用