簡體   English   中英

在Docker容器中調試Nodejs

[英]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在節點進程本地運行一樣。

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

  2. 通過使用與調試過程相同的安裝點,可以將文件局部性偽造到節點檢查器進程。

現在為了使它更方便,我建議使用數據容器作為您的應用程序源。

如果您希望在調試中啟動節點的可能性,請繼續使用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,但使用主機而不是容器網絡。

  • 在主node.js容器中,將端口5900映射到主機
  • 在啟用調試的情況下運行主節點進程
  • 使用單獨的容器來運行node-inspector
  • 為節點檢查器容器使用主機網絡

我在這里寫了一些關於它的細節: https//keylocation.sg/our-tech/debugging-nodejs-in-docker-using-node-inspector

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM