Systemd 単位で Docker-compose

Systemd 単位で Docker-compose

docker-compose特定のコンテナセットを起動および停止するコマンドを使用するシステムデバイスがあります。次のようになります。

[Unit]
Description=...

[Service]

WorkingDirectory=/opt/tsc-docker

RemainAfterExit=true
ExecStart=/usr/bin/docker-compose up -d --remove-orphans
ExecStop=/usr/bin/docker-compose down
Type=oneshot

[Install]
WantedBy=multi-user.target

デフォルトでは期待どおりに動作します。このサービスを開始するとコンテナが起動し、停止するとコンテナが終了します。

欠落しているのは、特定のコンテナ(およびこの質問の意味)のみを再起動する機能です。

つまり、コマンドを編集しdocker-compose.ymlて実行すると、docker-compose up -dすべてのコンテナではなく影響を受けたコンテナのみが再生成されます。

systemctl start TscDockerただし、現在のデバイス構成では影響を受けたコンテナを再実行して再作成することはできません。デバイスはすでに実行中なので、私のコマンドを無視します。を設定すると、コマンドはRemainAfterExit=false後でExecStop実行されますが、ExecStartこれは明らかに望ましくありません。

私にとって必要なのは、サービスを何度も起動でき、毎回実行されるたびにExecStart実行されるようにすることです。ExecStopExecStart

すべての条件を満たす構成を作成するにはどのようなオプションが必要ですか?

答え1

中断できないワンタイムサービスを使いたいようです。次のようになります。

[Unit]
Description=...

[Service]

WorkingDirectory=/opt/tsc-docker

RemainAfterExit=false
ExecStart=/usr/bin/docker-compose up -d --remove-orphans
Type=oneshot

[Install]
WantedBy=multi-user.target

ExecStart の実行が完了するとサービスが非アクティブ状態に戻るため、これによりサービスを複数回開始できます。この事実に対処するのは正しいことです。systemdのマンページへ指定する停止可能なワンタイムサービスでは、複数の起動コマンドを実行できません。

ExecStopを引き続き使用できる汚れた回避策は、次のようにExecReload関数を使用することです。

[Unit]
Description=...

[Service]

WorkingDirectory=/opt/tsc-docker

RemainAfterExit=true
ExecStart=/usr/bin/docker-compose up -d --remove-orphans
ExecReload=/usr/bin/docker-compose up -d --remove-orphans
ExecStop=/usr/bin/docker-compose down
Type=oneshot

[Install]
WantedBy=multi-user.target

これは、サービスがまだアクティブであると見なされている間に別のコマンドを実行する唯一の方法であるためです。その後利用できます

 systemctl reload TscDocker

関連情報