1. ホーム
  2. docker

[解決済み] Docker CMDを複数回使用して、複数のサービスを実行することができないのはなぜですか?

2022-05-18 02:42:18

質問

centos+sshというDockerfileからベースイメージを構築しています。centos+sshのDockerfileでは、sshサービスを実行するためにCMDを使用しています。

次に、rabbitmqという名前の他のサービスを実行するイメージをDockerfileで構築したいと思います。

FROM centos+ssh
EXPOSE 22
EXPOSE 4149
CMD /opt/mq/sbin/rabbitmq-server start

rabbitmqコンテナを起動するには,run:を実行します.

docker run -d -p 222:22 -p 4149:4149 rabbitmq

が、sshサービスは動作しません。rabbitmqのDockerfileのCMDがcentosのCMDを上書きしている感じです。

  1. dockerイメージの中でCMDはどのように動作するのでしょうか?
  2. 複数のサービスを実行したい場合、どのようにすればよいですか?supervisorを使う?

どのように解決するのですか?

CMDはDockerfileに書かれていますが、実際には実行時の情報です。EXPOSEと同じですが、RUNやADDなどとは異なります。つまり、Dockerfileを拡張したり、実行コマンドで上書きすることができます。常に、CMDは1つだけです。

複数のサービスを実行したい場合は、確かにsupervisorを使うことになりますね。各サービスごとにsupervisorの設定ファイルを作り、それをディレクトリにADDし、supervisorを実行する際に supervisord -c /etc/supervisor でsupervisorを実行すると、すべてのサービスをロードするsupervisor設定ファイルを指し示し、次のようになります。

[supervisord]
nodaemon=true

[include]
files = /etc/supervisor/conf.d/*.conf

もっと詳しく知りたい方は、こちらのブログで書いています。 http://blog.trifork.com/2014/03/11/using-supervisor-with-docker-to-manage-processes-supporting-image-inheritance/