debuggingDocker容器内的Nodejs
我正在计划一个nodejs应用程序的典型开发工作stream程。 我想大多数人会:
git clone [appcode] +(Dockerfile与卷映射到本地path)> docker-compose build> docker-compose up
然后我编辑一些代码,最好使用像Webstorm的IDE或文本编辑器Sublime等。然后terminalCtrl + C终止当前进程> docker-compose up(或者configuration你的容器使用nodemon监视代码的变化)并刷新浏览器看最新的本地代码运行。
以上所有的看起来都很标准吗?
我的主要问题是没有人debugging与IDE或节点检查到容器?
我试过暴露端口等。拒绝连接。 我相信因为node.js将只允许debugging127.0.0.1:5858
我设法让它在这里运行。 我希望我可以运行节点检查器作为一个sidekick容器,它会很干净( 编辑:这是可能的,见答案的结束 )。 不幸的是,查看节点检查器源,无法远程运行节点检查器(因为节点检查器需要访问文件以便显示它们),所以即使是容器链接也不在窗口中。 也许它会在某个时候支持它。
这是我的解决scheme:
在Dockerfile中,安装node-inspector。 我决定让它成为全球的,所以我可以使用相同的容器来debugging我所有的应用程序。
RUN npm install -g node-inspector
不是在CMD
命令中执行节点,而是使用bash脚本,它可以启动多个进程。 这不是Docker的方式,但正如我所说,限制在节点检查器阻止我们使用sidekick容器。 您也可以使用更强大的解决scheme来进行stream程pipe理,如监督员,但对于debugging简单的脚本来说,我认为是足够的。
CMD ["/bin/bash", "start.sh"]
此脚本检查是否存在DEBUG
环境variables以启动节点并启用debugging。
#!/bin/bash if [ -z ${DEBUG+x} ]; then node server.js else node-inspector --web-port 9080 & node --debug server.js fi
我想你可以使用相同的技巧来安装或不是节点检查器。 如果您想跳过安装脚本,甚至可以在RUN命令中使用条件语句 。
然后,当你想debugging一个容器,像这样启动它:
docker run -d -P -p 9080:9080 --env DEBUG=1 --name my_service \ -v /home/docker/sources/.../:/usr/src/app custom-node
现在,您只需要打开docker守护进程ip进行debugging,因为我们公开了docker run
命令脚本(9080)中指定的debugging端口。 我的Dockerfile已经公开我的主要端口,所以我用-P
。
如果您的容器在本地虚拟机上运行,并且设置在代理之后,请确保它支持本地地址,或者在debugging之前将其禁用。
编辑:现在与sidekick容器一起工作
以下是我的节点debugging容器Dockerfile的内容
FROM node:4.2.1 EXPOSE 9080 RUN npm install -g node-inspector CMD ["node-inspector", "--web-port", "9080"]
Docker为我们提供了2个特性,使得节点检查器在节点进程本地运行。
-
即使node-inspector似乎暗示你可以连接到远程机器,告诉你连接到
127.0.0.1:8080/?ws=127.0.0.1&port=5858
,我找不到parsingws
参数的代码我使用docker net config选项来将节点debugging容器popup到与我debugging的进程相同的networking堆栈中:–--net=container:mysvc
。 这样,node-inspector可以打开websocket连接to localhost:5858
。 -
通过使用与debugging过程相同的挂载点,可以将文件局部性伪装到节点检查器进程。
现在为了让它更方便一些,我build议使用数据容器来处理你的应用程序源代码。
如果您希望在debugging中启动节点,请继续使用start.sh脚本(尽pipe删除节点检查器命令)。 我不知道是否可以使用docker的信号 ,这将完全消除对start.sh的依赖。
if [ -z ${DEBUG+x} ]; then node server.js else node --debug server.js fi
所以创build数据容器:
docker create -v /home/docker/sources/.../:/usr/src/app \ --name my_service-src custom-node /bin/true
启动节点应用程序并展示node-inspectordebugging端口:
docker run -d -P -p 9080:9080 --env DEBUG=1 --name my_service \ --volumes-from my_service-src custom-node
启动节点debugging容器:
docker run -d --net=container:my_service --volumes-from my_service-src \ --name node-debug node-debug
这样,您可以快速产生节点debugging容器来debugging节点进程。
连接到docker ip并享受您的debugging会话!
在这种情况下,对debugging器(节点debugging)和应用程序服务器(定制节点)使用两个不同的映像是没有意义的。 由于定制节点容器需要安装节点检查器二进制文件。 否则, 无法find模块的/usr/lib/node_modules/node-inspector/lib/InjectorServer.js错误被推送到节点检查器客户端控制台,也没有被debugging。
我有一个类似于Eric的替代解决scheme,但使用主机而不是容器networking。
- 在主要的node.js容器中,将端口5900映射到主机
- 在启用debugging的情况下运行主节点进程
- 使用单独的容器来运行节点检查器
- 为节点检查器容器使用主机networking
我在这里写了更多的细节: https : //keylocation.sg/our-tech/debugging-nodejs-in-docker-using-node-inspector