Docker の複数プロセス起動に s6-overlay を使ってみました。が、まだ良く判っていないことが多いことをはじめにお断りしておきます。
メインのプロセスは、それが死んだら Docker コンテナも連動して落とし、その他のプロセスは常に監視して、落ちたら勝手に上げる仕組みだそうです。
インストール方法はググれば沢山出てきますので、今は省略します。徐々に追記していきます。
以下のいずれの方法も、シェルスクリプトに実行権限を付与することをお忘れなく。
#!/usr/bin/execlineb -P /usr/sbin/sshd -D -e
#!/usr/bin/execlineb -P nginx -g "daemon off;"
#!/usr/bin/execlineb -P php-fpm7.4 -F
上記では s6-overlay で提供されているツールを使っているが、普通にシェルを書いても起動は可能であった。また、メインプロセスが落ちたらコンテナが落ちるハズが、手動でプロセスを kill しても、何もなかったかの様に再生成されている。
s6-supervisor からのフォークとして監視対象にするには、起動スクリプト run でシェバングに
#!/usr/bin/execlineb -P
を指定し、かつ機動するプロセスはデーモンモードではなく、フォアグラウンドで実行しないと php-fpm などは起動できませんでした。
s6-supervisor の監視対象とする必要がないものは、シェバングを
#!/usr/bin/with-contenv sh
にすれば良いようです。少なくとも
#!/usr/bin/execlineb -P
でなければ、s6-supervisor からのフォークにはならない様です。
/usr/bin/with-contenv は .env という外部の環境変数ファイルを読み込んでくれるそうで、これを元に何かを起動するためのものの様です。必要なければ通常のシェバングで大丈夫でしょう。
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