私は今、Kubernetesクラスター上でシェル(/bin/bash)を使ってシンプルなコンテナを実行しようとしています。
私は、pseudo-tty
とdetachオプション(docker run
コマンドの-td
オプション)を使うことで、Dockerコンテナ上でコンテナを走らせ続ける方法があると思いました。
例えば
$ sudo docker run -td ubuntu:latest
Kubernetesでこのようなオプションはありますか?
私はkubectl run-container
コマンドを使って、以下のようにコンテナを実行してみました。
kubectl run-container test_container ubuntu:latest --replicas=1
しかし,コンテナは数秒で終了してしまいます(先ほどのdocker run
コマンドでオプションなしで起動したのと同じです)。そして、ReplicationControllerが再びコンテナを起動するということを繰り返します。
docker runコマンドの
-td`オプションのように、Kubernetes上でコンテナを起動し続ける方法はありますか?
このCMDをDockerfile
の中で使うことができます。
CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait"
これにより、停止を指示されるまでコンテナが生き続けます。trapとwaitを使用すると、コンテナは停止要求に対して即座に反応します。trap/waitを使用しない場合、停止には数秒かかります。
busyboxベースのイメージ(alpineベースのイメージで使用)では、sleepはinfinity引数を知りません。この回避策により、上記の例と同じように、docker stop
に対して即時に反応するようになります。
CMD exec /bin/sh -c "trap : TERM INT; (while true; do sleep 1000; done) & wait"
コンテナは、そのメインプロセスが終了すると終了します。のようなことをすると
docker run -itd debian
のようなことをしてコンテナを開いておくのは、はっきり言ってハックであり、簡単なテストや例にしか使うべきではありません。数分間のテストのためにコンテナが欲しいだけなら、私はそうします。
docker run -d debian sleep 300
これには、忘れた頃にコンテナが自動的に終了するという利点があります。あるいは、このようなものを while
ループに入れて永遠に実行し続けたり、top
のようなアプリケーションを実行したりすることもできます。これらはすべて、Kubernetesで簡単にできるはずです。
本当の問題は、なぜこのようなことをしたいのかということです。あなたのコンテナはサービスを提供するべきであり、そのプロセスはバックグラウンドでコンテナを実行し続けます。