🌵

Podman Quadlet で簡単systemd

2024/11/09に公開

コンテナをPodman Quadlet でsystemd 管理にする最短方法っぽいものです
QuadletのContainer などがありますが、文法は独自で面倒です。
PodmanではPodが簡単に作れるのでPodを作成してからKube Play unit形式のPodman Quadletにすることで従来のコンテナ作成方法の延長でsystemd 管理が簡単にできるのでおすすめです

Podman 4.4.0以降ぐらいで対応

コンテナ

PostgreSQL例
Podman または Podman Compose でコンテナを作成します。

# podman create --name pgsql docker.io/postgres:latest (いろいろ略)

停止するとコンテナも消えるので永続データの保存にはVOLUMEなどの設定が必要です

Pod変換

コンテナをKubernetes Pod形式の設定ファイルにします。Podとして作らなくても適度に補完してくれます。

# podman generate kube pgsql -f postgres-pod.yaml

設定を吸い取ったコンテナは不要なので削除します

# podman rm pgsql

この状態で使う場合は

起動 # podman kube play postgres-pod.yaml
停止 # podman kube down postgres-pod.yaml

簡単ですね

Kube Play unit

postgres.kube ファイルを作成します

postgres.kube
[Unit]
Description=PostgreSQL Server
Before=local-fs.target

[Kube]
Yaml=/var/pgsql/postgres-pod.yaml
PublishPort=127.0.0.1:5432:5432

[Service]
Restart=always

[Install]
WantedBy=multi-user.target default.target

Yaml をpostgres-pod.yaml ファイルのPathにします
PublishPort で開放するポートを適度に設定します

登録

/etc/containers/systemd にコピー
既存のsystemd管理の名前とかぶらないよう注意

# cp postgres.kube /etc/containers/systemd

エラーがないことだけ確認します

# /usr/lib/systemd/system-generators/podman-system-generator --user --dryrun

リロード

# systemctl daemon-reload

systemctl enable は不要
再起動後に systemd に組み込まれて起動、停止します

# shutdown -r now

再起動なしでも起動することはできます

# systemctl start postgres

podman 系のコマンドでは停止できない設定になっています

コマンド

起動 # systemctl start postgres
停止 # systemctl stop postgres
状態 # systemctl status postgres

削除

Quadlet 用ファイルを削除すれば systemd 管理から外れます

# rm /etc/containers/systemd/postgres.kube
# systemctl daemon-reload

Discussion