在Docker容器中调试Nodejs

Ste*_*coe 10 remote-debugging node.js docker

我正在计划nodejs app上典型开发人员的工作流程.我猜你们大多数人会:

git clone [appcode] +(带有映射到本地路径的卷的Dockerfile)> docker-compose build> docker-compose up

然后我编辑一些代码,最好使用像Webstorm或文本编辑器Sublime等IDE.然后终止Ctrl + C来杀死当前进程> docker-compose up(或配置你的容器使用nodemon来监视代码更改)并刷新浏览器查看运行的最新本地代码.

以上所有看起来都很标准吗?

我的主要问题是,是否有人使用IDE或节点检查容器进行调试?

我试过暴露端口等.连接拒绝.我相信因为node.js只允许在127.0.0.1:5858上进行调试

Eri*_*tin 23

我设法让它在这里运行.我希望我可以将node-inspector作为sidekick容器运行,它会如此干净(编辑:有可能,请参见答案结束).不幸的是,在查看节点检查器源时,无法远程运行节点检查器(因为节点检查器需要访问文件以便它们可以显示它们)所以即使容器链接也不在窗口内.也许它会在某些时候支持它.

这是我的解决方案:

在Dockerfile中,安装node-inspector.我决定将其设为全局,因此我可以使用相同的容器来调试我的所有应用程序.

RUN npm install -g node-inspector
Run Code Online (Sandbox Code Playgroud)

而不是在CMD命令中使用lunching节点,而是使用bash脚本,该脚本将允许您启动多个进程.这不是Docker方式,但正如我所说,node-inspector中的限制阻止我们使用sidekick容器.您也可以使用更强大的流程管理解决方案,如supervisor,但在我看来,调试简单的脚本就足够了.

CMD ["/bin/bash", "start.sh"]
Run Code Online (Sandbox Code Playgroud)

此脚本检查是否存在DEBUG环境变量以启动节点并启用调试.

#!/bin/bash

if [ -z ${DEBUG+x} ]; then
  node server.js
else
  node-inspector --web-port 9080 &
  node --debug server.js
fi
Run Code Online (Sandbox Code Playgroud)

我想你可以使用相同的技巧来安装或不安装节点检查器.如果要跳过安装脚本,甚至可以在RUN命令中使用条件语句.

然后,当您想要调试容器时,像这样启动它:

docker run -d -P -p 9080:9080 --env DEBUG=1 --name my_service \
    -v /home/docker/sources/.../:/usr/src/app custom-node
Run Code Online (Sandbox Code Playgroud)

现在您只需要访问docker守护程序ip进行调试,因为我们在docker run命令中公开了脚本(9080)中指定的调试端口.我的Dockerfile已暴露我的主端口,所以我用-P它.

如果您的容器在本地VM上运行并且您在代理后面进行设置,请确保它支持本地地址或在调试之前将其禁用.


编辑:现在使用sidekick容器

这是我的node-debug容器Dockerfile的内容

FROM node:4.2.1

EXPOSE 9080

RUN npm install -g node-inspector

CMD ["node-inspector", "--web-port", "9080"]
Run Code Online (Sandbox Code Playgroud)

Docker为我们提供了2个功能,就好像node-inspector在节点进程本地运行一样.

  1. 即使node-inspector似乎暗示你可以通过告诉你连接来连接到远程机器127.0.0.1:8080/?ws=127.0.0.1&port=5858,我找不到任何解析ws参数的代码所以我使用docker net config选项来弹出node-debug容器网络堆栈作为我的调试过程:--net=container:mysvc.这样,node-inspector可以打开websocket连接to localhost:5858.

  2. 通过使用与调试过程相同的安装点,可以将文件局部性伪造到节点检查器进程.

现在为了使它更方便,我建议使用数据容器作为您的应用程序源.

如果您希望在调试中启动节点的可能性,请继续使用start.sh脚本(尽管删除节点检查器命令).我想知道我们是否可以使用docker 信号,这将完全消除对start.sh的依赖.

if [ -z ${DEBUG+x} ]; then
  node server.js
else
  node --debug server.js
fi
Run Code Online (Sandbox Code Playgroud)

所以创建数据容器:

docker create -v /home/docker/sources/.../:/usr/src/app  \
    --name my_service-src custom-node /bin/true
Run Code Online (Sandbox Code Playgroud)

启动节点应用程序并公开node-inspector调试端口:

docker run -d -P -p 9080:9080 --env DEBUG=1 --name my_service \
    --volumes-from my_service-src custom-node
Run Code Online (Sandbox Code Playgroud)

启动node-debug容器:

docker run -d --net=container:my_service --volumes-from my_service-src \
    --name node-debug node-debug
Run Code Online (Sandbox Code Playgroud)

这样,您可以快速生成节点调试容器以调试节点进程.

连接到docker ip并享受您的调试会话!


maj*_*mer 5

经过一段时间的努力使其发挥作用后,我发现添加:

--inspect-brk=0.0.0.0:9229

而不是平常的inspect-brk

使事情顺利进行。

您还需要在 docker run 命令中正确映射端口:

-p 9229:9229

完整示例:

docker run -ti -p 3000:3000 -p 9229:9229 -v `pwd`:/app/ myImage bash

node --inspect-brk=0.0.0.0:9229 /app/index.js
Run Code Online (Sandbox Code Playgroud)

然后转到 chrome://inspect

然后点击“打开 Node 专用开发工具”,它应该可以正常工作:)