Dockerでsupervisorを使う時によくハマる点まとめ

morimorihoge です。最近格ゲー部に入部してGGXrd REV 2を始めました。高校時代にGGXをやっていたときと感覚が違いすぎてまだ全然ですが、チマチマ練習中です。 Dockerにはinitプロセスがないよ問題とsupervisor さて、Dockerコンテナはそのままではsystemdやsysvstat経由で起動を管理するサービス(nginxとかpostgresqlとかの永続系サービス)がうまく動きません。 これはDockerの設計思想によりinitプロセスがいないことが原因で、この辺りは Docker and the PID 1 zombie reaping problem にいい感じでまとまっています。 もしsystemdが使いたければDockerではなくsystemd-nspawnを使うのが楽でしょう、という話になるのですが、Dockerでinitプロセスを扱う試みもあるので、Dockerをできるかぎり軽量VMとして透過的に利用したいということなら以下のサイトなどが参考になりそうです。 参考: Dockerコンテナに使える「正しい」軽量init process(PID 1)まとめ では世の中のDockerユーザはこのinitプロセスがない問題をどう解決しているかというと、 supervisor というスーパーバイザ機能のみを提供する軽量プログラムを利用するのが一般的に思えます。Ubuntu系containerであれば apt-get install supervisor でインストールできます。 この辺りは以前社内勉強会で話したので別記事で解説しようと思います。 なお、本記事のDocker環境は普通のUbuntu 16.04LTSコンテナで、aptでパッケージインストールしたものです。 Dockerにおけるよくあるsupervisor設定のミス supervisor は非常に簡易な設定でプロセス起動管理ができるのでありがたいのですが、注意しないとハマります。 [supervisord] セクションで nodaemon=true にする これをtrueにしないとdaemonモードで起動します(こちらがデフォルト)。 daemonモードで起動してしまうと、Container立ち上げ時にすぐプロセスを手放してしまいContainerが終了します。 supervisorを設定したけどいざdocker runしたら一瞬でcontainerが止まってしまったという場合は大体これが原因です 。 [supervisord] nodaemon = true 参考: supervisordセクションの公式ドキュメント [program:x] セクションで autorestart を使う場合には注意する [program:#{PROGRAM_NAME}] セクションには … Continue reading Dockerでsupervisorを使う時によくハマる点まとめ