Dockerコンテナの「正しい」init processについては、Docker and the PID 1 zombie reaping problemが詳しいです。
Docker 1.13からは--init
オプションでtini相当のinit processを仕込んでくれるようになりました(Thanks to @sumomonekoさん )。以下の内容は--init
の機能が未だ利用できない場合(K8Sなどでコンテナを動かす、Docker 1.12以前、など)にのみ有効です。
1コンテナ単一アプリ対応・superviseなし
tini
- Handling of zombie processes would be useful
- 静的リンクしたバイナリは1MB弱。動的リンクなら10KBくらい
- 441 stars
- 129 commits
- 20 releases
- superviseの機能はなし
dumb-init
- Introducing dumb-init, an init system for Docker containers
- 静的リンクしたバイナリは700KB。ただし、muslと静的リンクさせて自分でビルドすれば20KB
- 992 stars
- 158 commits
- 13 releases
- superviseの機能はなし
1コンテナ複数アプリ対応・superviseあり
runit
- 著名なbaseimage-dockerはrunitを使ってますね
s6-overlay
s6というプロセス・スーパバイザをDockerコンテナのinit processとして使うためのツール一式です。
- S6 Made Easy, with the S6 Overlay | Tutum Blog
- バイナリは3.4MB
- 260 stars
- 170 commits
- 45 releases
- superviseの機能あり。
- superviseプロセスをフォアグラウンドで起動できる
- 複数アプリケーションを起動して、特定アプリをメインとしたい場合(例えば、cron、syslog、nginxを起動して、nginx以外は落ちたら再起動、nginxが落ちたらコンテナをエラー終了)はこれが唯一の選択肢?
Dockerコンテナ内で複数アプリケーションを実行したいときに使われる他のソリューション
-
Using Honcho to Create a Multi-Process Docker Container | via @codeship
- HonchoというProcfileベースのアプリケーション用のスーパーバイザ
- s6-overlay同様、代表的なプロセスが落ちたら、コンテナ自体を落とすことができる
- ただし、Honchoはinit processではない…ので、「正しく」使いたいなら、他のinit processと組み合わせる必要があり。そうすると、Honchoの必要性は…?
- プロセス毎にログがわかりやすくラベリングされるのはうれしいけど、Docker Loggingとの相性?
おまけ: Dockerコンテナのブートストラップに使えるテンプレートシステム
環境変数に応じて、設定ファイルや実行時引数を変えてプロセスを実行したい場合、
- シェルスクリプト等でラップする
- テンプレートシステムを使う
- 上記を組み合わせる
という選択肢があります。
対象となる設定ファイルが複数であったり、変数が多かったり、プロセス数が多かったりする場合は、テンプレートシステムを利用するとよいことがあります。
- voltgrid
- entrykit (Entrykitはゾンビプロセスをkillしてくれないので、正しいinit processではない認識です。違ってたら誰かこっそりおしえてください)
- johanhaleby/bash-templater & Simple templating engine in Bash
- confd (イメージサイズが20MBくらい増えて、Alpine等でがんばってるイメージが台無しになってしまいそうですが、コンテナ内の設定ファイル・テンプレートファイルの配置が規約化されていたりするなど、複雑なテンプレーティングが必要なイメージには向いている印象)