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
ないでしょう。-d
ExecStart
systemd
デフォルトはサービスに適している必要があるため、宣言Type=
やオプションも必要ない場合があります。RemainAfterExit=
docker-compose
単一のコンテナを提供するには、いずれかのpodman generate systemd
コンテナの出力を確認し、Docker サービスファイルを次のように調整することをお勧めします。
もう一つの注意:podman.service
で呼び出されるので、実行を続けないでくださいpodman.socket
。After=
参照設定が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
。これらのいくつかがあなたのコンテナを作るのに役立つことを願っています。