DockerNode.js を動かしてる案件があるんだけど、何かのタイミングでサービスが落ちてしまう時がある。
本当だったら原因を突き止めて修正するのが一番なんだろうけど、今回は forever を利用してお茶を濁すことにした。

で、 Node.js で起動してるスクリプトを forever に変えてみたんだけど、そのままではうまくいかない。

ポイントとしては、

  • Docker はCMDで起動させたスクリプトが終了するとコンテナも終了する
  • node index.js と起動するとスクリプトは起動しっぱなし(なんで Docker は終了しない)
  • forever は別プロセスでモニタ用コマンドと node index.js を立ち上げて、自身は終了する(なんで Docker は終了してしまう)

って感じで、 node index.js で立ち上げてた時は落ちるまでコマンドが起動中となり Docker は終了しないが、 forever 経由にすると別プロセスに道を譲るので Docker は終了したと思いコンテナを終了してしまうってのが問題っぽい。

ほほう。と思いながらどういう解決方法があるかぐぐってみたところ、このスライド「 DockerQuickTour 」の23ページがわかりやすかった。
/bin/bash をループに入れて常時起動させておくってやり方なんで、 docker attach してもシェルが使えるし。

ちなみに、このページでは外部ファイルにして読み込んでるんだけど、Dockerfileの中でechoを使って init.sh を作成してそれを実行させることにした。
せっかくDockerfileで環境をコードにすることができるようになったのにファイルが増えていくのは面倒なんで。

この foreverNode.js に限らず、どんなスクリプトでもデーモン化できるので結構重宝しそうな感じ。

ちなみに、 Node.js では想定外のエラーが発生しても以下のコードを入れておけばサービスは継続してくれるはずっぽいけど、こちらの環境ではなぜかおちてしまう。

拾ってくれるエラーもあるんだけど、モジュールの作りによるのかなぁ。