Dockerコンテナをサービスとして実行しようとしています。いくつかの異なるサーバー間でクラスタ化されたサービスであり、接続に数秒かかることがあります。コンテナは、実際にコンテナを出ることなく、失敗ループに詰まることがあります。 systemdは誤ってスタートアップを成功として報告します。私はsystemctl start myservice
を実行すると、それは(一見のでdocker pull
の)を開始するまでに数秒かかり、システム起動サービスのログファイルの監視
TimeoutStartSec=60
Restart=always
RestartSec=10
ExecStartPre=-/usr/bin/docker stop %n
ExecStartPre=-/usr/bin/docker rm %n
ExecStartPre=/usr/bin/docker pull my_container
ExecStart=/usr/bin/docker run --name %n my_container
ExecStartPost=until [ /usr/bin/docker logs %n 2>&1 | grep -m 1 \"All services up and running.\" ]; do sleep 1; done
が、比較的すぐに成功を返します。私は私のユニットファイルにこれらの事を持つプロセスを監視しようとしています。
ただし、手動でdocker logs -f myservice.service
を実行すると、サービスが「すべてのサービスが起動して実行中」というメッセージが数秒間ログに記録されないことがわかります。
私はhttps://github.com/ibuildthecloud/systemd-dockerを見ましたが、1年以上更新されていないレポについては気を付けています(DarrenはRancherと忙しそうです)。
私の質問:なぜ私のExecStartPostは機能しませんか? systemdを使ってコンテナをサービスとして直接起動する方法はありますか?
本当にsystemdが必要ですか? Dockerデーモンはプロセスの実行を継続します。 "run"コマンドには、ポリシーを再起動するオプションがあります:https://docs.docker.com/engine/reference/run/#/restart-policies---restart –
私は必要です本番環境では相互に依存しない複数のサービスを実行するため、それらを管理するためのきれいな方法が必要です。どのように 'docker run'を直接使うのか分かりません。 rc.local?マニュアル? – aayore
Dockerデーモンはそれ自体がプロセスマネージャです。 "-d"と "--restart = always"オプションでコンテナを実行すると、バックグラウンドで実行され、失敗すると自動的に再起動されます。 –