コンテナは起動後、実行しているプロセスがなかったら停止してしまいます。
そのため、例えば apache を起動するコンテナだと、
DokerFile で、
1 |
CMD ["/usr/sbin/httpd","-D", "FOREGROUND"] |
と指定したり、スクリプト中で実行する場合は、
1 |
ENTRYPOINT ["entrypoint.sh"] |
として、 entrypoint.sh 中で、
1 |
/usr/sbin/httpd -D FOREGROUND |
としたりします。
(apache を FOREGROUND で起動することで、プロセスが落ちないようにしている、と思う。)
上記のように、FOREGROUND で起動する事ができない場合は、tail -f /dev/null
を使うといいです。
例えば、 entrypoint.sh で下記のように最後に書きます。
1 2 3 4 5 |
〜 いろんな処理 〜 tail -f /dev/null |
こうすることで、entrypoint.sh を実行するプロセスが落ちないので、コンテナは停止せずに起動中のままになります。
もしくは、 tty オプションを使います。
docker-compose だと、下記のように tty: true
と指定することで有効にします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
version: "3" services: test: container_name: "test" build: context: ./ ports: - 80:80 privileged: true tty: true volumes: - "./:/data" environment: TZ: 'Asia/Tokyo' |
これは、 docker run コマンドの t オプションに相当し、docker コマンドでは下記のように実行することで、 tty が有効になります。
1 |
$ docker run --name test -it debian |
※ -it
についてくわしくは こちら
tty を指定するほうが良いのか、 tail -f /dev/null
を指定するほうが良いのか、どちらでも良いように思いますが、 tail -f /dev/null
だと、実行時のオプションに関わらず、プロセスが落ちないようにすることができます。