コンテナは起動後、実行しているプロセスがなかったら停止してしまいます。
そのため、例えば apache を起動するコンテナだと、
DokerFile で、
CMD ["/usr/sbin/httpd","-D", "FOREGROUND"]
と指定したり、スクリプト中で実行する場合は、
ENTRYPOINT ["entrypoint.sh"]
として、 entrypoint.sh 中で、
/usr/sbin/httpd -D FOREGROUND
としたりします。
(apache を FOREGROUND で起動することで、プロセスが落ちないようにしている、と思う。)
上記のように、FOREGROUND で起動する事ができない場合は、tail -f /dev/null を使うといいです。
例えば、 entrypoint.sh で下記のように最後に書きます。
〜
いろんな処理
〜
tail -f /dev/null
こうすることで、entrypoint.sh を実行するプロセスが落ちないので、コンテナは停止せずに起動中のままになります。
もしくは、 tty オプションを使います。
docker-compose だと、下記のように tty: true と指定することで有効にします。
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 が有効になります。
$ docker run --name test -it debian
※ -it についてくわしくは こちら
tty を指定するほうが良いのか、 tail -f /dev/null を指定するほうが良いのか、どちらでも良いように思いますが、 tail -f /dev/null だと、実行時のオプションに関わらず、プロセスが落ちないようにすることができます。
