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
実行されるようにすることです。ExecStop
ExecStart
すべての条件を満たす構成を作成するにはどのようなオプションが必要ですか?
答え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