consul
小規模なCoreOSクラスタを設定しようとしています。次のファイルを に保存し、/etc/systemd/system/consul.service
サービスを有効にして VM を再起動すると、クラスタ内の 3 つの VM がすべて正常に起動し、一緒に接続されます。
[Unit]
Description=consul
After=etcd2.service
After=docker.service
[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill consul
ExecStartPre=-/usr/bin/docker rm consul
ExecStart=/usr/bin/docker run -d --name consul --network host consul agent -server -bootstrap-expect=3 -data-dir /tmp/consul -bind BIND_IPADDR --node NODE_NAME -retry-join IPADDR1 -retry-join IPADDR2
# ExecStop=/usr/bin/docker container exec consul consul leave
# ExecStopPost=/usr/bin/docker container stop consul
# ExecStopPost=/usr/bin/docker container rm consul
[Install]
WantedBy=multi-user.target
ただし、コマンドからコメントを削除すると、ExecStop
VMの再起動後にconsulコンテナが実行されないため、起動は失敗します。systemctl --failed
ただし、サービス障害は報告されません。
私は何が間違っていましたか?私は誤解しましたかExecStop
?Consul
?
答え1
質問(または少なくとも一つ問題)-d
あなたがにいるということですExecStart=
。
systemd は、サービスの開始時に実行されるコマンドを実行し続けたい。つまり、フォアグラウンドで実行されます。少なくともサービスを設定すると、Type=simple
これは基本的なタイプであり、お使いのデバイスで動作します。
(あなたのように)すぐに終了するコマンドを実行すると、docker run -d
systemdはサービスが開始されたと仮定し、完了するまでしばらく保持します。したがって、コンテナが実行され続けている間、systemdサービスはコンテナが実行されていないと思います。同様のコマンドを使用してこれを確認できますsystemctl status consul.service
。 (このコマンドを頻繁にチェックすると、systemdが考えているサービスの状態を理解するのに役立ちます。ここに出力を投稿すると、発生する追加の問題を診断するのに役立ちます。)
一部のコマンドがあると問題が発生するのは、ExecStopPost=
systemdがサービスが完了したと仮定してコンテナを終了するため、そのコマンドを実行することです。
-d
コマンドからdocker run
削除するだけでExecStart=
問題を解決できます。