14.6. Podman を使用した systemd ユニットファイルの自動生成
デフォルトで、Podman は既存のコンテナーまたは Pod のユニットファイルを生成します。podman generate systemd --new
を使用すると、より移植性の高い systemd
ユニットファイルを生成できます。--new
フラグでは、コンテナーの作成、起動、削除を行うユニットファイルを生成するように Podman に指示します。
Podman v4.6 以降では、Quadlet を使用できるようになりました。Quadlet を使用すると、通常の systemd
ユニットファイルと同様の形式でコンテナーを実行する方法を記述でき、systemd
でコンテナーを実行する際の複雑さを意識せずに済みます。
前提条件
-
container-tools
モジュールがインストールされている。
手順
システムで使用するイメージをプルします。たとえば、
httpd-24
イメージをプルするには、以下を実行します。# podman pull registry.access.redhat.com/ubi8/httpd-24
オプション: システムで使用可能なすべてのイメージをリストします。
# podman images REPOSITORY TAG IMAGE ID CREATED SIZE registry.access.redhat.com/ubi8/httpd-24 latest 8594be0a0b57 2 weeks ago 462 MB
httpd
コンテナーを作成します。# podman create --name httpd -p 8080:8080 registry.access.redhat.com/ubi8/httpd-24 cdb9f981cf143021b1679599d860026b13a77187f75e46cc0eac85293710a4b1
オプション: コンテナーが作成されたことを確認します。
# podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cdb9f981cf14 registry.access.redhat.com/ubi8/httpd-24:latest /usr/bin/run-http... 5 minutes ago Created 0.0.0.0:8080->8080/tcp httpd
httpd
コンテナーのsystemd
ユニットファイルを生成します。# podman generate systemd --new --files --name httpd /root/container-httpd.service
生成された
container-httpd.service
systemd
ユニットファイルの内容を表示します。# cat /root/container-httpd.service # container-httpd.service # autogenerated by Podman 3.3.1 # Wed Sep 8 20:41:44 CEST 2021 [Unit] Description=Podman container-httpd.service Documentation=man:podman-generate-systemd(1) Wants=network-online.target After=network-online.target RequiresMountsFor=%t/containers [Service] Environment=PODMAN_SYSTEMD_UNIT=%n Restart=on-failure TimeoutStopSec=70 ExecStartPre=/bin/rm -f %t/%n.ctr-id ExecStart=/usr/bin/podman run --cidfile=%t/%n.ctr-id --sdnotify=conmon --cgroups=no-conmon --rm -d --replace --name httpd -p 8080:8080 registry.access.redhat.com/ubi8/httpd-24 ExecStop=/usr/bin/podman stop --ignore --cidfile=%t/%n.ctr-id ExecStopPost=/usr/bin/podman rm -f --ignore --cidfile=%t/%n.ctr-id Type=notify NotifyAccess=all [Install] WantedBy=multi-user.target default.target
--new
オプションを使用してユニットファイルを生成した場合には、コンテナーと Pod の存在は想定されていません。したがって、サービスの起動時に (ExecStart
の行を参照)、podman start
コマンドではなく、podman run
コマンドを実行します。たとえば、Generating a systemd unit file using Podmanのセクションを参照してください。
podman run
コマンドは、以下のコマンドラインオプションを使用します。-
--conmon-pidfile
オプションは、ホストで実行しているconmon
プロセスのプロセス ID を格納するパスを指します。conmon
プロセスはコンテナーと同じ終了ステータスで終了します。これにより、systemd
は正しいサービスステータスを報告し、必要に応じてコンテナーを再起動できます。 -
--cidfile
オプションは、コンテナー ID を格納するパスを指します。 -
%t
は、ランタイムディレクトリーのルートへのパスです (例:/run/user/$UserID
)。 %n
は、サービスの完全な名前です。/etc/systemd/system
にユニットファイルをコピーして root ユーザーとしてインストールします。# cp -Z container-httpd.service /etc/systemd/system
container-httpd.service
を有効にして起動します。# systemctl daemon-reload # systemctl enable --now container-httpd.service Created symlink /etc/systemd/system/multi-user.target.wants/container-httpd.service
/etc/systemd/system/container-httpd.service. Created symlink /etc/systemd/system/default.target.wants/container-httpd.service /etc/systemd/system/container-httpd.service.
-
検証
container-httpd.service
のステータスを確認します。# systemctl status container-httpd.service ● container-httpd.service - Podman container-httpd.service Loaded: loaded (/etc/systemd/system/container-httpd.service; enabled; vendor preset: disabled) Active: active (running) since Tue 2021-08-24 09:53:40 EDT; 1min 5s ago Docs: man:podman-generate-systemd(1) Process: 493317 ExecStart=/usr/bin/podman run --conmon-pidfile /run/container-httpd.pid --cidfile /run/container-httpd.ctr-id --cgroups=no-conmon -d --repla> Process: 493315 ExecStartPre=/bin/rm -f /run/container-httpd.pid /run/container-httpd.ctr-id (code=exited, status=0/SUCCESS) Main PID: 493435 (conmon) ...