1. ホーム
  2. docker

[解決済み] dockerコンテナの実行時にサービスを自動的に開始するには?

2022-04-13 19:28:10

質問

私は Dockerfile を使ってコンテナにMySQLサーバをインストールし、このように起動します。

sudo docker run -t -i 09d18b9a12be /bin/bash

しかし、MySQL サービスは自動的に開始されないので、(コンテナ内から)手動で実行する必要があります。

service mysql start

dockerコンテナを実行する際に、MySQLサービスを自動的に起動するにはどうすればよいですか?

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

まず 問題 を使用します。 Dockerfile :

RUN service mysql restart && /tmp/setup.sh

Dockerイメージは、実行中のプロセスを保存しません。そのため RUN の間だけ実行されます。 docker build フェーズで、ビルドが完了すると停止します。 代わりに、コンテナの起動時にコマンドを指定する必要があります。 CMD または ENTRYPOINT コマンドを使用します。

CMD mysql start

次に、dockerコンテナはプロセス(最後のコマンド)を実行し続ける必要があり、そうしないとコンテナは終了/停止してしまいます。そのため、通常の service mysql start コマンドは、Dockerfileの中で直接使用することはできません。

解決方法

プロセスを稼働させ続けるための代表的な方法は3つあります。

  • 使用方法 service コマンドを実行し、その後に非終了コマンドを追加します。 tail -F

    CMD service mysql start && tail -F /var/log/mysql/error.log
    
    

出力されたログに docker がアクセスできるようになるため、単一のサービスを実行している場合に好まれることが多いです。

  • または、foregroundコマンドを使用して行います。

    CMD /usr/bin/mysqld_safe
    
    

のようなスクリプトがある場合のみ機能します。 mysqld_safe .

  • または、スクリプトを start.sh で、最後にこう書きます。

    CMD /start.sh
    
    

コマンドが一連のステップを実行する必要がある場合は、やはりこれが最適です。 /start.sh は実行し続ける必要があります。

備考

を使用する初心者のために supervisord はお勧めしません。正直言って、やりすぎです。 コンテナには、単一のサービス、単一のコマンドを使用する方がずっとよいでしょう。

ちなみに https://registry.hub.docker.com 既存の mysql の docker イメージを参照する。