2017-08-09 187 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