2015-10-07 83 views
10

我正在規劃nodejs應用程序中典型dev的工作流程。我相信你們中的大多數會:在Docker容器中調試Nodejs

混帳克隆[appcode] +(Dockerfile與卷映射到本地路徑)>泊塢窗,撰寫構建>泊塢窗,構成了

然後我修改一些代碼,最好使用像Webstorm或文本編輯器Sublime等IDE。然後終端Ctrl + C終止當前進程> docker-compose up(或配置您的容器使用nodemon監視代碼更改)並刷新瀏覽器以查看最新的本地代碼運行。

以上所有看起來都很標準嗎?

我的主要問題是沒有人調試與IDE或節點檢查到容器?

我試過暴露端口等。拒絕連接。我相信,因爲node.js將只允許調試127.0.0.1:5858

+0

我使用了'docker logs -f [docker_name]' –

+0

所以@NguyenSyThanhSon你是說你使用日誌來執行簡單的調試嗎? 我希望有一個解決方案,我可以像使用webstorm的正常節點項目那樣設置斷點。 –

+0

在這方面做了一點,認爲我的解決方案非常乾淨。讓我知道你的想法。 –

回答

22

我設法讓它在這裏運行。我希望我可以運行節點檢查器作爲一個sidekick容器,它會很乾淨(編輯:這是可能的,見答案結束)。不幸的是,查看節點檢查器源代碼時,無法遠程運行節點檢查器(因爲節點檢查器需要訪問文件以便顯示它們),所以即使容器鏈接也不在窗口中。也許它會在某個時候支持它。

這是我的解決方案:

在Dockerfile中,安裝node-inspector。我決定讓它全球化,以便我可以使用相同的容器來調試我的所有應用程序。

RUN npm install -g node-inspector 

而是在CMD命令共進午餐節點,使用bash腳本,可以讓你推出多單進程多。這不是Docker的方式,但正如我所說的,限制在節點檢查器中阻止我們使用sidekick容器。您還可以使用更強大的解決方案進行流程管理,如supervisor,但對於調試簡單的腳本而言,我認爲已足夠。

CMD ["/bin/bash", "start.sh"] 

用於DEBUG環境變量的存在此腳本檢查啓動節點和啓用調試。

#!/bin/bash 

if [ -z ${DEBUG+x} ]; then 
    node server.js 
else 
    node-inspector --web-port 9080 & 
    node --debug server.js 
fi 

我想你可以使用相同的技巧來安裝或不是節點檢查器。如果您想跳過安裝腳本,甚至可以使用conditional statement in RUN command

然後,當你要調試的容器,啓動它就像這樣:

docker run -d -P -p 9080:9080 --env DEBUG=1 --name my_service \ 
    -v /home/docker/sources/.../:/usr/src/app custom-node 

現在你只需要點擊調試泊塢窗守護IP,因爲我們暴露在腳本中指定的調試端口(9080)在docker run命令上。我的Dockerfile已經公開我的主端口,所以我使用了-P

如果您的容器在本地虛擬機上運行,​​並且您設置在代理之後,請確保它支持本地地址或在調試之前禁用它。


編輯:現在與老搭檔容器

這裏是我的節點調試容器的內容Dockerfile

FROM node:4.2.1 

EXPOSE 9080 

RUN npm install -g node-inspector 

CMD ["node-inspector", "--web-port", "9080"] 

碼頭工人爲我們提供了2個功能,使它彷彿節點 - 檢查員在節點進程本地運行。

  1. 即使節點檢查似乎暗示着你可以告訴你連接到遠程計算機連接到127.0.0.1:8080/?ws=127.0.0.1&port=5858,我找不到這是解析ws參數,所以我用泊塢窗淨配置選項的任何代碼彈出與調試過程相同的網絡堆棧中的節點調試容器:--net=container:mysvc。這樣,節點檢查員可以打開websocket連接to localhost:5858

  2. 通過使用與調試過程相同的掛載點,您可以將文件局部性僞裝成節點檢查器進程。

現在爲了讓它更方便一些,我建議您使用data container作爲您的應用程序源代碼。

如果您希望在調試中啓動節點,請繼續使用start.sh腳本(儘管刪除節點檢查器命令)。我想知道是否我們可以使用docker的signal,這將完全消除對start.sh的依賴。

if [ -z ${DEBUG+x} ]; then 
    node server.js 
else 
    node --debug server.js 
fi 

因此,創建數據容器:

docker create -v /home/docker/sources/.../:/usr/src/app \ 
    --name my_service-src custom-node /bin/true 

啓動節點應用程序和暴露節點檢查調試端口:

docker run -d -P -p 9080:9080 --env DEBUG=1 --name my_service \ 
    --volumes-from my_service-src custom-node 

啓動節點調試容器:

docker run -d --net=container:my_service --volumes-from my_service-src \ 
    --name node-debug node-debug 

這樣,你可以很快產卵n ode-debug容器即時調試節點進程。

連接到docker ip並享受您的調試會話!

+0

這是光榮的,我不認爲你有足夠的學分! –

+0

node-inspector已棄用請參閱github.com/node-inspector/node-inspector – Gerd

0

在這種情況下,對調試器(節點調試)和應用服務器(自定義節點)使用兩個不同的映像是沒有意義的。由於定製節點容器還需要安裝節點檢查器二進制文件。否則,一個找不到模塊'/usr/lib/node_modules/node-inspector/lib/InjectorServer.js'錯誤被推入到節點檢查器客戶端控制檯中,也沒有任何內容被調試。

0

掙扎了一會兒,以得到這個工作後,我發現,添加:

--inspect-brk=0.0.0.0:9229

,而不只是一般的inspect-brk

做事情的工作。

您還需要你的端口在你的搬運工運行命令正確映射:

-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 

然後轉到chrome://檢查

並點擊「打開專用DevTools的節點」,它應該都工作:)

相關問題