MySQLサーバーをコンテナーにインストールするためのDockerfileがあり、それを次のように開始します。
sudo docker run -t -i 09d18b9a12be /bin/bash
しかし、MySQLサービスは自動的に開始されません。手動で(コンテナー内から)実行する必要があります。
service mysql start
dockerコンテナーを実行するときに、MySQLサービスを自動的に開始するにはどうすればよいですか?
MySQLサーバーをコンテナーにインストールするためのDockerfileがあり、それを次のように開始します。
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
or 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がアクセスできるようにするため、単一のサービスを実行している場合によく使用されます。
または、フォアグラウンドコマンドを使用してこれを実行します
CMD /usr/bin/mysqld_safe
これは、のようなスクリプトがある場合にのみ機能しますmysqld_safe
。
または、スクリプトをにラップして、start.sh
これを最後に配置します
CMD /start.sh
これは、コマンドが一連のステップを実行する必要がある場合、やはり/start.sh
実行を継続する必要がある場合に最適です。
初心者のsupervisord
方にはお勧めできません。正直、やりすぎです。コンテナーには単一のサービス/単一のコマンドを使用する方がはるかに優れています。
ところで、参照のために既存のmysql dockerイメージがないかhttps://registry.hub.docker.comを確認してください
docker exec -it <CONTAINER NAME> mysql /etc/init.d/mysqld restart
あなたDockerfile
の最後の行に追加します
ENTRYPOINT service ssh restart && bash
わたしにはできる
そしてこれが結果です:
root@ubuntu:/home/vagrant/docker/add# docker run -i -t ubuntu
* Restarting OpenBSD Secure Shell server sshd [ OK ]
root@dccc354e422e:~# service ssh status
* sshd is running
docker stop
たり、docker restart
正常に停止したりすることはできません。
それを行うには、私がいつもより読みやすいと思っている別の方法があります。
実行時にrabbitmqとmongodbを起動したいとすると、次のようになりますCMD
。
CMD /etc/init.d/rabbitmq-server start && \
/etc/init.d/mongod start
あなたは一つだけ持つことができますので、CMD
あたりDockerfile
トリックをしてすべての命令を連結することで&&
、次に使う\
新しい行を開始するには、各コマンドのために。
それらの多くに追加してしまう場合は、すべてのコマンドをスクリプトファイルに入れ、@ larry-caiが提案するように開始することをお勧めします。
CMD /start.sh
私の場合、Apache2によって提供されるPHP Webアプリケーションが、MYSQLバックエンドデータベースに接続するdockerコンテナー内にあります。Larry Caiのソリューションは、小さな変更で機能しました。entrypoint.sh
サービスを管理するファイルを作成しました。entrypoint.sh
コンテナーの起動時に実行するコマンドが複数あるときにを作成すると、Dockerをブートストラップするためのよりクリーンな方法になると思います。
#!/bin/sh
set -e
echo "Starting the mysql daemon"
service mysql start
echo "navigating to volume /var/www"
cd /var/www
echo "Creating soft link"
ln -s /opt/mysite mysite
a2enmod headers
service apache2 restart
a2ensite mysite.conf
a2dissite 000-default.conf
service apache2 reload
if [ -z "$1" ]
then
exec "/usr/sbin/apache2 -D -foreground"
else
exec "$1"
fi
ENTRYPOINT ['your location']
命令をスクリプトファイルにポイントします。ただし、スクリプトの実行権限を設定することを忘れないでください。COPY entrypoint.sh /entrypoint.sh RUN chmod 755 /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"]
。この例では、エントリーポイントをDockerコンテナーのルートディレクトリにコピーしました。
sshサービスを自動的に開始したいのですが、同じ問題があります。私はそれを見つけました
/etc/init.d/ssh startに
〜/ .bashrcそれを解決できますが、bashで開くことができるのはあなただけです。
次のコードを/root/.bashrcに追加して、コードを1回だけ実行します。
このスクリプトを実行する前に、コンテナをイメージにコミットしてください。そうしないと、「docker_services」ファイルがイメージ内に作成され、サービスは実行されません。
if [ ! -e /var/run/docker_services ]; then
echo "Starting services"
service mysql start
service ssh start
service nginx start
touch /var/run/docker_services
fi
dockerコンテナーが実行されるたびに、MySQLサービスを自動的に開始する方法を次に示します。
私の場合、MySQLだけでなくPHP、Nginx、Memcachedも実行する必要があります
Dockerfileに次の行があります
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
EXPOSE 80
EXPOSE 3306
CMD service mysql start && service php-fpm start && nginx -g 'daemon off;' && service memcached start && bash
&& bashを追加すると、コンテナー内でNginx、MySQL、PHP、Memcachedが実行され続けます。
これは機能しません CMD service mysql start && /bin/bash
これは機能しません CMD service mysql start ; /bin/bash ;
-インタラクティブモードはフォアグラウンドをサポートしないと思います。
これはうまくいきます! CMD service nginx start ; while true ; do sleep 100; done;
これはうまくいきます! CMD service nginx start && tail -F /var/log/nginx/access.log
docker run -p 80:80 nginx_bash
コマンドパラメータなしで使用する必要があることに注意してください。
Docker Webサイトの次のドキュメントは、DockerコンテナーにSSHサービスを実装する方法を示しています。それはあなたのサービスに簡単に適応できるはずです:
この質問のバリエーションもここで尋ねられました:
docker export -o <nameOfContainer>.tar <nameOfContainer>
docker pruneを使用して既存のコンテナーを削除する必要があるかもしれません...
必要な変更を加えてインポート:
cat <nameOfContainer>.tar | docker import -c "ENTRYPOINT service mysql start && /bin/bash" - <nameOfContainer>
たとえば、常に再起動オプションを指定してコンテナーを実行し、ホスト/デーモンのリサイクル後にコンテナーが自動的に再開されるようにします。
docker run -d -t -i --restart always --name <nameOfContainer> <nameOfContainer> /bin/bash
補足:私の意見では、コンテナーをできるだけクリーンにしてcronサービスのみを開始し、対応するチェック/監視スクリプトを使用してcrontabまたはcron.hourly、.dailyなどを変更するだけです。理由は1つのデーモンのみに依存しているため、変更の場合は、起動時に開始するサービスを追跡するのではなく、ansibleまたはpuppetを使用してcronスクリプトを再配布する方が簡単です。