dockerのPID1

これ、当たり前なんだけどコンテナをつくるとき、主たるプロセスのPIDが1になるようにつくならないといけない。

 

entrypoint.sh などからプロセスを起動すると、entrypoint.shがPID=1になってしまう。

それを回避するためには、

 

entrypoint.sh

 

exec hogehoge

 

とすると、起動したプロセスのPIDが1になる。

 

追記

 

httpdrsyslogdを上げる場合、以下のようにすると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

 

rsyslogdの親プロセスがhttpdになるんか、、、

ちょっと気持ち悪いが、、、supervisorを使う手もあるようだ。

まぁ、開発環境ならこれでOK。

 

 

追記

 

そうそう、なんでPID=1じゃないといかないかというと、コンテナ終了するときにPID=1に対して、kill -TERM を送るんですね。

そうすると、アプリケーションは正常に終了しようとするんですが、kill -TERMが処理できないと10秒まって強制的にすべてのプロセスを殺しにかかります。

そうすると、データが消し飛んだりファイルが壊れたりするので、コンテナ内の実行プロセスはPID=1にしなさい、ということです。

複数のプロセスを起動させるのが推奨されないのも同様の理由。

仮想マシンのようには使えないって話ですわ。

 

 

追記

 

あれ、SpringBootの起動スクリプトもexecつけないとだめじゃない?

startup.shに対して終了しようとしちゃうしね。

なおそう。