docker/docker-compose/podman 結果のようなPIDのないサービスにsystemdを使用できませんか?

docker/docker-compose/podman 結果のようなPIDのないサービスにsystemdを使用できませんか?

docker/docker-compose/podman設定を体系化したいのですが、systemdがプロセスを終了せずに終了するサービスユニットを正しく処理できないようです。これは、問題のツールがプロセスの開始をスケジュールしますが、独自に生成または分岐しないAPIを呼び出すことで機能するため、問題になります。したがって、docker-compose呼び出しが返されると、systemdに表示されるプロセスがないため、Type / RemainAfterExitは変更があっても残っているPIDが検出されないため、サービスが停止/死/停止されていることを示しています。

これが関連しているかどうかはわかりませんが、ユーザースペースで実行されています--user。ユーザーに対して遅延が有効になっています。

これはシステムを操作しようとする多くの試みの1つですが、他の設定の組み合わせと同様に5秒後に停止します。

[Unit]
Description=%u service with docker compose
BindsTo=podman.service
After=podman.service

[Service]
Environment=DOCKER_HOST=unix:///run/user/%U/podman/podman.sock
Environment=XDG_RUNTIME_DIR=/run/user/%U
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/srv/podman/%u
ExecStart=/usr/local/bin/docker-compose up -d --remove-orphans
ExecStop=/usr/local/bin/docker-compose down -v

[Install]
WantedBy=default.target

上記のファイルから始めましたsystemctl --user start myservice.service。次の出力が生成されます。

May 04 14:10:27 myhost systemd[841]: Starting myservice service with docker compose...
May 04 14:10:27 myhost docker-compose[106023]:  Container nginx  Creating
May 04 14:10:27 myhost docker-compose[106023]:  Container nginx  Created
May 04 14:10:27 myhost docker-compose[106023]:  Container nginx  Starting
May 04 14:10:27 myhost docker-compose[106023]:  Container nginx  Started
May 04 14:10:27 myhost systemd[841]: Finished myservice service with docker compose.
May 04 14:10:32 myhost systemd[841]: Stopping myservice service with docker compose...
May 04 14:12:03 myhost systemd[841]: myservice.service: Stopping timed out. Terminating.
May 04 14:12:03 myhost systemd[841]: myservice.service: Failed with result 'timeout'.
May 04 14:12:03 myhost systemd[841]: myservice.service: Unit process 106072 (docker-compose) remains running after unit stopped.
May 04 14:12:03 myhost systemd[841]: Stopped myservice service with docker compose.
May 04 14:12:03 myhost docker-compose[106072]:  Container nginx  Stopping
May 04 14:12:03 myhost docker-compose[106072]:  Container nginx  Stopped
May 04 14:12:03 myhost docker-compose[106072]:  Container nginx  Removing
May 04 14:12:03 myhost docker-compose[106072]:  Container nginx  Removed

答え1

docker-compose実行時に正しく追跡できるように、プロセスをデーモン化する(そのオプションを削除)したくsystemdないでしょう。-dExecStartsystemd

デフォルトはサービスに適している必要があるため、宣言Type=やオプションも必要ない場合があります。RemainAfterExit=docker-compose

単一のコンテナを提供するには、いずれかのpodman generate systemdコンテナの出力を確認し、Docker サービスファイルを次のように調整することをお勧めします。

もう一つの注意:podman.serviceで呼び出されるので、実行を続けないでくださいpodman.socketAfter=参照設定がpodman.socket目的の動作に近づくことがあります。そのBindsTo=オプションがあなたが探しているものかどうかはわかりません。podman.socketコマンドの実行には必要ですが、docker-composeコンテナの実行には必須ではなく、Podman APIの再起動時にすべてのコンテナを再起動したいかどうかはわかりません。

要約すると、公開されたサービスファイルは次のようになります。

[Unit]
Description=%u service with docker compose
After=podman.socket

[Service]
Environment=DOCKER_HOST=unix:///run/user/%U/podman/podman.sock
Environment=XDG_RUNTIME_DIR=/run/user/%U
WorkingDirectory=/srv/podman/%u
ExecStart=/usr/local/bin/docker-compose up --remove-orphans
ExecStop=/usr/local/bin/docker-compose down -v

[Install]
WantedBy=default.target

これは走って渡る私のpodman経験docker-composeですsystemd。これらのいくつかがあなたのコンテナを作るのに役立つことを願っています。

関連情報