2015-10-07 24 views
10

nodejsアプリケーションで一般的な開発者のワークフローを計画しています。 、そして、私はいくつかのコードを編集Dockerコンテナ内のNodejをデバッグ

をドッキングウィンドウ-構成>(ローカルパスにボリュームマッピングとDockerfile)gitのクローン[appcode] +

>ドッキングウィンドウ・コンビルド:私は希望あなたのほとんどを推定します好ましくは、WebstormやテキストエディタのSublimeなどのIDEを使用してください。次に、Ctrl + Cキーを押して現在のプロセスを終了します。> docker-compose(または、コード変更を監視するためにnodemonを使用するようにコンテナを設定します。

上記のすべてがかなり標準的ですか?

私の主な質問は誰でもIDEまたはノードインスペクタでコンテナにデバッグするのですか?

ポートなどを公開しようとしました。接続が拒否されました。私は、node.jsは127.0.0.1:5858のデバッグしか許可しないので、私は信じている

+0

'docker logs -f [docker_name]'を使用しました –

+0

@NguyenSyThanhSonはログを使って、必要に応じてログアウトして単純なデバッグを実行すると言っていますか? 私は、Webstormを使って通常のノードプロジェクトでできるように、私がブレークポイントを設定できる解決策を望んでいました。 –

+0

少しこれに取り組んで、私のソリューションはかなりきれいだと思います。どう考えているか教えてください。 –

答えて

22

私はここでそれを実行することができた。私は、サイドキックのコンテナとしてノードインスペクタを実行することができたら、それはとてもきれいだろう(編集:それは可能です、答えの最後を参照してください)。残念ながら、ノードインスペクタのソースを調べると、ノードインスペクタをリモートで実行することはできません(ノードインスペクタはファイルを表示できるようにファイルにアクセスする必要があるため)。おそらくそれはある時点でそれをサポートするでしょう。

ここにありますが、私のソリューションです:Dockerfileで

、ノード・インスペクタをインストールします。私はすべての私のアプリをデバッグするために同じコンテナを使用することができるようにグローバルにすることにしました。

RUN npm install -g node-inspector 

代わりのCMDコマンドでノードをlunching、あなたは、単一のプロセスよりも起動できるようになるbashスクリプトを使用します。これはDockerの方法ではありませんが、私が述べたように、ノードインスペクタでの制限は、サイドキーコンテナの使用を防ぎます。 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にすることもできます。あなたは、コンテナをデバッグしたいとき

次に、そのようにそれを起動します。我々は、スクリプト(9080)で指定されたデバッグポートを公開するので

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

は今、あなただけのデバッグのためのドッキングウィンドウデーモンのIPをヒットする必要がありますdocker runコマンドを使用します。私のDockerfileはすでに私のメインポートを公開していますので、私は-Pを使っています。

コンテナがローカルVM上で動作し、プロキシの背後に設定されている場合は、ローカルアドレスをサポートするか、デバッグする前に無効にするかを確認してください。


EDIT:今相棒コンテナと

に動作します。ここだ、私のノード・デバッグ・コンテナの内容ですDockerfile

ドッカーは、リンパ節転移かのようにそれを作るために私たち2つの機能を提供し
FROM node:4.2.1 

EXPOSE 9080 

RUN npm install -g node-inspector 

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

インスペクタはノードプロセスでローカルに実行されていました。

  1. ノード-検査官はあなたが127.0.0.1:8080/?ws=127.0.0.1&port=5858に接続するためにあなたを伝えることで、リモートマシンに接続することができますを意味するように見えても、私はwsパラメータを解析して任意のコードを見つけることができませんでしたので、私はにドッキングウィンドウのネット設定オプションを使用デバッグされたプロセスと同じネットワークスタックのnode-debugコンテナをポップしてください:--net=container:mysvc。この方法で、ノードインスペクタはWebソケット接続to localhost:5858を開くことができます。ノード・インスペクター・プロセスに同じことができます、あなたのデバッグプロセスとしてマウントポイントを偽のファイルの局所性を利用することにより

もう少し便利になるように、私はあなたのアプリソースにdata containerを使用することをお勧めします。

デバッグ中かどうかのノードを開始する可能性がしたい場合は、start.shスクリプトを使用(ただしノードインスペクタコマンドを削除)し続けます。私たちはいえドッキングウィンドウで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コンテナをオンザフライで実行して、ノードプロセスをデバッグします。

コネクトIPをドッキングウィンドウとデバッグセッションを楽しむために!

+0

これは栄光です、私はあなたがそれのために十分なクレジットを持っているとは思わない! –

+0

ノードインスペクタは推奨されていませんgithub.com/node-inspector/node-inspector – Gerd

0

この場合、デバッガ(ノード - デバッグ)とアプリケーションサーバー(カスタムノード)に2つの異なるイメージを使用することは意味がありません。 などのカスタム・ノードコンテナはあまりにもインストールされているノード・インスペクタのバイナリを必要とします。そうでなければは、モジュールの/usr/lib/node_modules/node-inspector/lib/InjectorServer.js "エラーがノード・インスペクタークライアント側のコンソールに押され、何も同様にデバッグされていない見つけることができません。

0

私は上記のEricと似ていますが、コンテナのネットワーキングではなくホストを使用する代替ソリューションを用意しています。メインノードにおいて

  • 。ホストへのJSコンテナ、マップポート5900
  • 実行、デバッグとメインノードのプロセスは、ノード・インスペクターコンテナ

のためのネットワークノード-インスペクター

  • 使用ホストを実行するための別の容器を使用し
  • を有効に私はここでそれについていくつかの詳細を書いた:

    を:https://keylocation.sg/our-tech/debugging-nodejs-in-docker-using-node-inspector

  • 0

    この作業を取得するためにしばらく苦労した後、私は追加することがわかりましただけではなく、通常のinspect-brk

    は物事が働かせました。

    あなたはまた、あなたのドッキングウィンドウ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 
    

    その後クロムに行く://は

    を検査

    「ノード専用のDevToolsを開く」を押すと、すべて動作するはずです。

    関連する問題