目次

Docker の複数プロセス起動に s6-overlay を使ってみる

Docker の複数プロセス起動に s6-overlay を使ってみました。が、まだ良く判っていないことが多いことをはじめにお断りしておきます。

メインのプロセスは、それが死んだら Docker コンテナも連動して落とし、その他のプロセスは常に監視して、落ちたら勝手に上げる仕組みだそうです。

インストール方法はググれば沢山出てきますので、今は省略します。徐々に追記していきます。

起動スクリプトの書き方

以下のいずれの方法も、シェルスクリプトに実行権限を付与することをお忘れなく。

sshd の場合

run
#!/usr/bin/execlineb -P
/usr/sbin/sshd -D -e

Nginx の場合

run
#!/usr/bin/execlineb -P
nginx -g "daemon off;"

php-fpm の場合

run
#!/usr/bin/execlineb -P
php-fpm7.4 -F

調査中

上記では s6-overlay で提供されているツールを使っているが、普通にシェルを書いても起動は可能であった。また、メインプロセスが落ちたらコンテナが落ちるハズが、手動でプロセスを kill しても、何もなかったかの様に再生成されている。

execlineb

s6-supervisor からのフォークとして監視対象にするには、起動スクリプト run でシェバングに

#!/usr/bin/execlineb -P

を指定し、かつ機動するプロセスはデーモンモードではなく、フォアグラウンドで実行しないと php-fpm などは起動できませんでした。

with-contenv

s6-supervisor の監視対象とする必要がないものは、シェバングを

#!/usr/bin/with-contenv sh

にすれば良いようです。少なくとも

#!/usr/bin/execlineb -P

でなければ、s6-supervisor からのフォークにはならない様です。

/usr/bin/with-contenv は .env という外部の環境変数ファイルを読み込んでくれるそうで、これを元に何かを起動するためのものの様です。必要なければ通常のシェバングで大丈夫でしょう。

exec

s6 からのシグナルを受けるには exec が必要と書かれていましたが、書いていないスクリプトが多く、どうなんでしょうか。。。

その他

他にも、ネット上には sshd 起動のサンプルとして例えば以下の様なスクリプトがあり、今のところ何をしているのかわかっていません。更に調査が必要です。

#!/usr/bin/execlineb -P
foreground { s6-mkdir -p -m 750 /var/run/sshd }
fdmove -c 2 1
if { /usr/sbin/sshd -t }
/usr/sbin/sshd -D -e