ExecStopコマンドが含まれていると、サービス(consul)は正常に起動しません。

ExecStopコマンドが含まれていると、サービス(consul)は正常に起動しません。

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

ただし、コマンドからコメントを削除すると、ExecStopVMの再起動後にconsulコンテナが実行されないため、起動は失敗します。systemctl --failedただし、サービス障害は報告されません。

私は何が間違っていましたか?私は誤解しましたかExecStopConsul

ベストアンサー1

質問(または少なくとも一つ問題)-dあなたがにいるということですExecStart=

systemd は、サービスの開始時に実行されるコマンドを実行し続けたい。つまり、フォアグラウンドで実行されます。少なくともサービスを設定すると、Type=simpleこれは基本的なタイプであり、お使いのデバイスで動作します。

(あなたのように)すぐに終了するコマンドを実行すると、docker run -dsystemdはサービスが開始されたと仮定し、完了するまでしばらく保持します。したがって、コンテナが実行され続けている間、systemdサービスはコンテナが実行されていないと思います。同様のコマンドを使用してこれを確認できますsystemctl status consul.service。 (このコマンドを頻繁にチェックすると、systemdが考えているサービスの状態を理解するのに役立ちます。ここに出力を投稿すると、発生する追加の問題を診断するのに役立ちます。)

一部のコマンドがあると問題が発生するのは、ExecStopPost=systemdがサービスが完了したと仮定してコンテナを終了するため、そのコマンドを実行することです。

-dコマンドからdocker run削除するだけでExecStart=問題を解決できます。

おすすめ記事