dockerのPID1
これ、当たり前なんだけどコンテナをつくるとき、主たるプロセスのPIDが1になるようにつくならないといけない。
entrypoint.sh などからプロセスを起動すると、entrypoint.shがPID=1になってしまう。
それを回避するためには、
entrypoint.sh
exec hogehoge
とすると、起動したプロセスのPIDが1になる。
追記
httpdとrsyslogdを上げる場合、以下のようにするとhttpdのPIDが1になる。
RUN echo '[ -f /usr/sbin/rsyslogd ] && /usr/sbin/rsyslogd' >> $HOME/entrypoint.sh
RUN echo 'exec /usr/sbin/httpd -DFOREGROUND' >> $HOME/entrypoint.sh
RUN chmod +x $HOME/entrypoint.sh
[root@d90b4e4b2160 setup]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 09:32 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
root 9 1 0 09:32 ? 00:00:00 /usr/sbin/rsyslogd
apache 12 1 0 09:32 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 13 1 0 09:32 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 14 1 0 09:32 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 15 1 0 09:32 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 16 1 0 09:32 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
root 17 0 0 09:32 pts/0 00:00:00 /bin/bash
root 34 17 0 09:32 pts/0 00:00:00 ps -ef
ちょっと気持ち悪いが、、、supervisorを使う手もあるようだ。
まぁ、開発環境ならこれでOK。
追記
そうそう、なんでPID=1じゃないといかないかというと、コンテナ終了するときにPID=1に対して、kill -TERM を送るんですね。
そうすると、アプリケーションは正常に終了しようとするんですが、kill -TERMが処理できないと10秒まって強制的にすべてのプロセスを殺しにかかります。
そうすると、データが消し飛んだりファイルが壊れたりするので、コンテナ内の実行プロセスはPID=1にしなさい、ということです。
複数のプロセスを起動させるのが推奨されないのも同様の理由。
仮想マシンのようには使えないって話ですわ。
追記
あれ、SpringBootの起動スクリプトもexecつけないとだめじゃない?
startup.shに対して終了しようとしちゃうしね。
なおそう。