1. ホーム

[解決済み】サービス開始後にDockerコンテナを起動し続けるには?

2022-04-20 23:44:32

質問

私がやろうとしていることと同じことをするチュートリアルをたくさん見ましたが、なぜか私のDockerコンテナは終了してしまいます。基本的に、私はDockerコンテナ内にウェブサーバといくつかのデーモンをセットアップしています。というbashスクリプトで最終的に行っています。 run-all.sh をDockerfileのCMDで実行しています。 run-all.sh はこのようになります。

service supervisor start
service nginx start

そして、以下のようにDockerfileの中で起動させています。

CMD ["sh", "/root/credentialize_and_run.sh"]

手動で実行した場合 (つまり -i -t /bin/bash でイメージにアクセスした場合) はすべてのサービスが正しく起動し、イメージを実行した場合はすべてが正しく実行されているように見えますが、私のプロセスの起動が終了すると終了してしまいます。私はプロセスを無期限に実行させたいのですが、私が理解する限り、これを実現するためにはコンテナを実行し続ける必要があります。それにもかかわらず、私が docker ps -a と表示されます。

➜  docker_test  docker ps -a
CONTAINER ID        IMAGE                            COMMAND                CREATED             STATUS                      PORTS               NAMES
c7706edc4189        some_name/some_repo:blah   "sh /root/run-all.sh   8 minutes ago       Exited (0) 8 minutes ago                        grave_jones

何が原因なのか?なぜ終了してしまうのでしょうか?bashスクリプトの最後にwhileループを入れればいいのはわかっているのですが、終了しないようにする正しい方法は何でしょうか?

解決方法は?

これは、Dockerコンテナを設計する上で、本当に必要な方法とは言えません。

Dockerコンテナを設計する場合、コンテナ内にあるのは 一つ を実行し(つまり、Nginx 用のコンテナを1つ、supervisord またはそれが実行されているアプリ用に1つ用意する)、さらに、そのプロセスはフォアグラウンドで実行される必要があります。

プロセス自体が終了すると、コンテナは "exit" します (あなたの場合、プロセスはあなたの bash スクリプトです)。


しかし、もし 本当に Docker コンテナで複数のサービスを実行する必要がある (または実行したい) 場合は、以下の手順で開始することを検討してください。 Docker Base Image" を使用しています。 runit を擬似的な初期化プロセスとして使用することができます ( runit は、Nginx と Supervisor が動作している間、オンライン状態を維持します)、他のプロセスが動作している間、フォアグラウンドに留まります。

ドキュメントが充実しているので、あなたがやろうとしていることを簡単に実現できるはずです。