2017-08-09 186 views
1

已经过了两天了,我仍然无法理解这个应该是简单的事情!NodeJS使用Docker进行远程调试

我想:

  • 创建的NodeJS码头工人群体的服务,并在 调试模式
  • 运行的NodeJS揭露代码调试端口主办
  • 能够连接从到调试主办

最简单的步骤来重现问题:

[email protected] docker service create --name dbg-nodejs --publish 4444:4444 node sleep 10d 
[email protected] containerID=$(docker container ls --filter name=dbg-nodejs | awk 'FNR == 2 {print $1}') ### find the containerId 
[email protected] docker exec -d $containerID /bin/bash -c "(echo \"console.log('\n\n\nHello from NodeJS\n\n\n');\" > /usr/test-dbg.js) && node --inspect-brk=4444 /usr/test-dbg.js" 
[email protected] docker exec $containerID /bin/bash -c "curl localhost:4444 -v" ### you see the output here! Great the debugging port is working within the container 
[email protected] curl localhost:4444 -v ### aaahhhhh <<--- CANNOT CONNECT TO the published 4444 port!!!!!! 

发布端口工作正常。如果我使用容器运行一个使用4444的netcat,它就可以正常工作!不知何故节点调试器的行为不同。但它不应该!这只是TCP! :/

更多信息: 因此,如果不是node --inspect-brk=4444 /usr/test-dbg.js我做netcat -l -p 4444,事情工作正常。即使用默认的入口网络,我可以从主机连接到容器。不知何故,行为是不同的!他们都是TCP。

回答

1

绝对离奇!但是端口转发解决了这个问题。一切都是相同的,除了:

  • 而不是4444,我用另一个端口连接的NodeJS调试器,例如,端口#5555
  • 我使用这个命令用来socat转发4444到5555:socat -v tcp-listen:4444,reuseaddr,fork tcp:localhost:5555

当然,您需要在您的码头集装箱上安装socat。但就是这样!不知何故,Docker处理NodeJS调试器TCP的方式与socat TCP不同!或许,NodeJS调试器不会侦听所有网络接口上的端口,并且使其无法获取连接。

工作的完整示例:

[email protected] docker service create --name dbg-nodejs --publish 4444:4444 node sleep 10d 
[email protected] containerID=$(docker container ls --filter name=dbg-nodejs | awk 'FNR == 2 {print $1}') ### find the containerId 
[email protected] docker exec -d $containerID /bin/bash -c "(echo \"console.log('\n\n\nHello from NodeJS\n\n\n');\" > /usr/test-dbg.js) && node --inspect-brk=5555 /usr/test-dbg.js" 
[email protected] docker exec $containerID /bin/bash -c "apt-get update && apt-get -y install socat" 
[email protected] docker exec -d $containerID /bin/bash -c "socat -v tcp-listen:4444,reuseaddr,fork tcp:localhost:5555" 
[email protected] docker exec $containerID /bin/bash -c "curl localhost:4444 -v" ### you see the output here! Great the debugging port is working within the container 
[email protected] docker exec $containerID /bin/bash -c "curl localhost:5555 -v" ### you will see the same as we forwarded 5555 to 4444 
[email protected] curl localhost:4444 -v ### <<--- IT WORKS!! [email protected] --> [email protected] --> [email protected] (nodejs debugger) 

注:当您看到“WebSockets的要求,预计”这意味着它实际上得到连接,并得到了响应来自调试回来。

至于调试工具,我还没有找到一种方法来使用webstorm呢。但是,Chrome开发工具调试工具和节点检查工作正常。对于chrome开发工具,当使用node --inspect-brk标志运行时,从终端复制并粘贴输出。确保根据端口转发来调整端口。在Chrome浏览器开发工具的地址看起来是这样的:

chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:38213/03b57c12-d8ca-4100-b852-1aacce107880

更多细节上的调试工具: https://nodejs.org/en/docs/inspector/

+0

我可以按照你所描述的转发端口,但我仍然无法使用WebStorm来远程调试它。您是否在使用WebStorm,或者您是否至少可以将我指向正确的方向?谢谢。 –

+1

增加了一些信息。希望能帮助到你。 – Kasra

+1

真棒谢谢!我得到了铬调试器从此工作。但为了使用WebStorm,我必须将节点降级到版本7.x –

0

默认情况下,Docker群使用入口网络模式。
你必须使用mode=host

docker service create --name dbg-nodejs --mode global --publish mode=host,target=4444,published=4444 node sleep 10d 

我还加--mode global如果你有多个主机。 有关更多详细信息,请参阅documentation

如果使用docker ps命令,则会看到端口已发布。

旧命令:

CONTAINER ID  IMAGE     COMMAND     CREATED    STATUS    PORTS     NAMES 
edd8753b3cc2  node:latest   "sleep 10d"    9 seconds ago  Up 8 seconds         dbg-nodejs.1.49q0ega6a8fwgsoxk6pxaus8u 

工作命令:

CONTAINER ID  IMAGE     COMMAND     CREATED    STATUS    PORTS      NAMES 
44e3c8265a3b  node:latest    "sleep 10d"    4 minutes ago  Up 4 minutes  0.0.0.0:4444->4444/tcp  dbg-nodejs.hkd4aifekr8hwxm3xurzl 
+0

我知道入口网络是什么,但是这是因为无关我只有一个节点。我在这个问题中增加了更多细节,关于用netcat重做测试。 – Kasra