[英]Debug Nodejs inside Docker container
我正在計划nodejs app上典型開發人員的工作流程。 我猜你們大多數人會:
git clone [appcode] +(帶有映射到本地路徑的卷的Dockerfile)> docker-compose build> docker-compose up
然后我編輯一些代碼,最好使用像Webstorm或文本編輯器Sublime等IDE。然后終止Ctrl + C來殺死當前進程> docker-compose up(或配置你的容器使用nodemon來監視代碼更改)並刷新瀏覽器看到運行的最新本地代碼。
以上所有看起來都很標准嗎?
我的主要問題是,是否有人使用IDE或節點檢查容器進行調試?
我試過暴露端口等。連接拒絕。 我相信因為node.js只允許在127.0.0.1:5858上進行調試
我設法讓它在這里運行。 我希望我可以將node-inspector作為sidekick容器運行,它會非常干凈( 編輯:有可能,請參閱答案結束 )。 不幸的是,在查看節點檢查器源時,無法遠程運行節點檢查器(因為節點檢查器需要訪問文件以便它們可以顯示它們)所以即使容器鏈接也不在窗口內。 也許它會在某些時候支持它。
這是我的解決方案:
在Dockerfile中,安裝node-inspector。 我決定將其設為全局,因此我可以使用相同的容器來調試我的所有應用程序。
RUN npm install -g node-inspector
而不是在CMD
命令中使用lunching節點,而是使用bash腳本,該腳本將允許您啟動多個進程。 這不是Docker方式,但正如我所說,node-inspector中的限制阻止我們使用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
我想你可以使用相同的技巧來安裝或不安裝節點檢查器。 如果要跳過安裝腳本,甚至可以在RUN命令中使用條件語句 。
然后,當您想要調試容器時,像這樣啟動它:
docker run -d -P -p 9080:9080 --env DEBUG=1 --name my_service \
-v /home/docker/sources/.../:/usr/src/app custom-node
現在,您只需要訪問docker守護程序ip進行調試,因為我們在docker run
命令中公開了腳本(9080)中指定的調試端口。 我的Dockerfile已暴露我的主端口,所以我使用了-P
。
如果您的容器在本地VM上運行並且您在代理后面進行設置,請確保它支持本地地址或在調試之前將其禁用。
編輯:現在使用sidekick容器
這是我的node-debug容器Dockerfile的內容
FROM node:4.2.1
EXPOSE 9080
RUN npm install -g node-inspector
CMD ["node-inspector", "--web-port", "9080"]
Docker為我們提供了2個功能,就好像node-inspector在節點進程本地運行一樣。
即使node-inspector似乎暗示你可以通過告訴你連接到127.0.0.1:8080/?ws=127.0.0.1&port=5858
來連接到遠程機器,我找不到任何解析ws
參數的代碼所以我使用docker net config選項在與調試過程相同的網絡堆棧中彈出node-debug容器: - --net=container:mysvc
。 這樣,node-inspector可以打開與to localhost:5858
的websocket連接。
通過使用與調試過程相同的安裝點,可以將文件局部性偽造到節點檢查器進程。
現在為了使它更方便,我建議使用數據容器作為您的應用程序源。
如果您希望在調試中啟動節點的可能性,請繼續使用start.sh腳本(盡管刪除節點檢查器命令)。 我想知道我們是否可以使用docker 信號 ,這將完全消除對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
啟動節點應用程序並公開node-inspector調試端口:
docker run -d -P -p 9080:9080 --env DEBUG=1 --name my_service \
--volumes-from my_service-src custom-node
啟動node-debug容器:
docker run -d --net=container:my_service --volumes-from my_service-src \
--name node-debug node-debug
這樣,您可以快速生成節點調試容器以調試節點進程。
連接到docker ip並享受您的調試會話!
經過一段時間的努力讓這個工作,我發現添加:
--inspect-brk=0.0.0.0:9229
而不僅僅是通常inspect-brk
使事情有效。
您還需要在docker run命令中正確映射端口:
-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:// inspect
點擊“打開專用的DevTools for Node”,它應該全部工作:)
在這種情況下,使用兩個不同的圖像進行調試(節點調試)和應用服務器(自定義節點)是沒有意義的。 由於自定義節點容器也需要安裝node-inspector二進制文件。 否則, 無法找到模塊'/usr/lib/node_modules/node-inspector/lib/InjectorServer.js'錯誤被推送到節點檢查器客戶端控制台,並且也沒有調試任何內容。
我有一個替代解決方案,類似於上面的Eric,但使用主機而不是容器網絡。
我在這里寫了一些關於它的細節: https : //keylocation.sg/our-tech/debugging-nodejs-in-docker-using-node-inspector
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.