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在节点进程本地运行一样.
即使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.
通过使用与调试过程相同的安装点,可以将文件局部性伪造到节点检查器进程.
现在为了使它更方便,我建议使用数据容器作为您的应用程序源.
如果您希望在调试中启动节点的可能性,请继续使用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并享受您的调试会话!
经过一段时间的努力使其发挥作用后,我发现添加:
--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 专用开发工具”,它应该可以正常工作:)
| 归档时间: |
|
| 查看次数: |
5710 次 |
| 最近记录: |