systemd は、サービス A が B を開始できるようにします。

systemd は、サービス A が B を開始できるようにします。

Snapを使ってDockerをインストールしました。 snapがdockerを更新するたびに、snap.docker.dockerd(デフォルト)サービスが停止してから一定時間後に開始されます。 docker-composeアプリケーションが実行されているため、アプリケーションを更新するたびに競合が発生します。

エラーのため、Docker Composeを再起動するオプションは機能しません(https://github.com/docker/for-win/issues/584)

だから私が見ることができる唯一のオプションはsystemdサービスを使うことです。これは(/etc/systemd/system/docker-compose-chebur.service)です:

[Unit]
Description=Docker Compose Chebur
Requires=snap.docker.dockerd.service
PartOf=snap.docker.dockerd.service
After=snap.docker.dockerd.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/home/maybephilipp/projects/chebur-docker
User=maybephilipp
Group=docker
ExecStartPre=/usr/bin/sleep 3
ExecStart=/snap/bin/docker compose -f chebur.docker-compose.yml up -d
ExecStop=/snap/bin/docker compose -f chebur.docker-compose.yml down
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target

オペレーティングシステム:Ubuntu 20.04.4

BindsTo =、PartOf =、Requires =を試しましたが、インターネット上で読んだように、snap.docker.dockerdが停止しているときに実際にサービスを開始するのに役立ちません。

だから私の質問は:スナップが終了したときにサービスを開始し、ドッカーサービスを開始するにはどうすればよいですか?

docker compose up -d2番目の考えは、5分以内に実行されるクローンタブを作成することでした。しかし、汚れているようです:(

答え1

セクションを次に変更したいと思います[Install]

[Install]
WantedBy=multi-user.target
WantedBy=snap.docker.dockerd.service

その後、もう一度実行してくださいsystemctl enable docker-compose-chebur.service


あなたはゲームをしていて、Requires=ほぼBindsTo=正しい考えを持っていますが、間違った方向に向かっています。ずっと「docker-compose-chebur.service始めれば私も始めるsnap.docker.dockerd.service」と言いましたね。ただし、「snap.docker.dockerd.service起動時に開始されます」という反対が必要です。したがって、をdocker-compose-chebur.service追加する必要があります。このサービスのみ変更できる場合、の逆は、セクションでのみ設定できます。 orセクションに設定するのが一般的であるため、通常は間違っていますが、必要に応じて直接挿入して実行できます。Wants=Requires=BindsTo=snap.docker.dockerd.serviceWants=Requires=WantedBy=RequiredBy=[Install]BoundBy=[Unit][Install]


これは、定義したすべての関係の説明です。たぶんすべてが必要ではないかもしれません。

  • Requires=A.service:これが始まると、A.serviceまた始まります。After=設定して起動A.serviceできない場合は起動しません。
  • PartOf=A.serviceA.service停止/再起動時にも停止/再起動されます。
  • After=A.service:バラよりRequires=
  • WantedBy=A.serviceA.service起動したら、これも始めてください。RequiredBy=whichとは異なり、Requires=成功確認をスキップします。

snap.docker.dockerd.serviceあなたの場合は、すでに存在していることを確認しますWantedBy=multi-user.target。それでは、その行を入れて[Install]簡単にしますWantedBy=snap.docker.dockerd.service

引用: https://www.freedesktop.org/software/systemd/man/systemd.unit.html

関連情報