2017-01-05 11 views
0

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を使ってコンテナをサービスとして直接起動する方法はありますか?

+0

本当にsystemdが必要ですか? Dockerデーモンはプロセスの実行を継続します。 "run"コマンドには、ポリシーを再起動するオプションがあります:https://docs.docker.com/engine/reference/run/#/restart-policies---restart –

+0

私は必要です本番環境では相互に依存しない複数のサービスを実行するため、それらを管理するためのきれいな方法が必要です。どのように 'docker run'を直接使うのか分かりません。 rc.local?マニュアル? – aayore

+0

Dockerデーモンはそれ自体がプロセスマネージャです。 "-d"と "--restart = always"オプションでコンテナを実行すると、バックグラウンドで実行され、失敗すると自動的に再起動されます。 –

答えて

0

私はこれをうまく動作させる方法を見つけ出しました。解決策は少し面白かったです。私がやろうとしていたことは大丈夫でした、私はgrepとsleepの完全な道が必要でした。

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 | /bin/grep -m 1 \"String that indicates my service is up successfully\" ]; do /bin/sleep 1; done 

私はこれを少しテストしましたが、うまくいくようです。

関連する問題