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个特性,使得节点检查器在节点进程本地运行。

  1. 即使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

  2. 通过使用与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