私は CoreOS が私たちのニーズを満たしているかどうかをテストしています。私はsystemdが好きですが、正しく動作していないようです-具体的には、シャットダウン時です。
私の目標
私の目標は、サービスの開始時と停止時にスクリプトを実行して、サービスの DNS サーバーからそれぞれレコードを追加および削除することです。起動時にシステムによってサービスが開始されたとき、または手動で開始またはシャットダウンされたときに機能しますが、システムが再起動または停止されたときは機能しません ( shutdown -r now
、shutdown -h now
)。
これは、私が例として使用している docker レジストリ サービスの少し簡略化されたバージョンです。
[Unit]
Description=Docker Registry
After=docker.service
Before=registry-ui.service
Wants=registry-ui.service
[Service]
Conflicts=halt.target poweroff.target reboot.target shutdown.target sleep.target
TimeoutStartSec=0
Restart=on-failure
ExecStartPre=-/usr/bin/docker kill Registry
ExecStartPre=-/usr/bin/docker rm Registry
ExecStartPre=-/usr/bin/docker run --rm myrepo:5000/tool runtool arg1 arg2
ExecStart=/usr/bin/docker run various args registry:latest
ExecStop=-/usr/bin/docker run --rm myrepo:5000/tool runtool arg1 arg2
ExecStop=-/usr/bin/docker stop Registry
[X-Fleet]
MachineID=coreos1
[Install]
WantedBy=multi-user.target
RequiredBy=registry-ui.service
Also=registry-ui.service
(このユニットは、別のユニットregistry-ui.serviceと連携して動作します。一方が開始されると、もう一方も同様に動作します。)
行に注意してくださいConflicts=...
。サービスが適切にシャットダウンされなかった理由を突き止めようと時間を費やした後、追加しました。何もしませんでした。ただし、ドキュメントによると、サービスにはConflicts=shutdown.target
デフォルトで行があります。サービスが競合し、一方が起動すると、もう一方がシャットダウンします-またはドキュメントによると。
私は何を取りこぼしたか?ExecStop=
ラインが実行されないのはなぜですか?
アップデート
私は、ExecStop=
ラインが実行されることを確認しました。を使用するjournalctl -u registry.service -n 200
と、次のメッセージが表示されました。
Error response from daemon: Cannot start container 7b9083a3f81710febc24256b715fcff1e8146c867500c6e8ce4d170ad1cfd11a: dbus: connection closed by user
これは、(コメントで推測したように) シャットダウン中に Docker コンテナーが起動しないことが問題であることを示しています。[Unit]
セクションに次の行を追加しました。
[Unit]
After=docker.service docker.socket
Requires=docker.service docker.socket
...
新しい行はjournalctlエラーに影響を与えないので、私の質問は、シャットダウンする前にユーティリティdockerコンテナを実行する方法はありますか?