用 systemd 管理 podman containers

Podman 原本有提供指令可以產生 systemd service 的設定檔,但是產生出來的檔案內容感覺有很多改善的空間,例如要怎麼讓 podman 可以乖乖的把 log 送到 journald 就不是產生的範本有提供的。

podman generate systemd wordpress-container

在研究這個問題的時候發現這個指令已經被 Quadlet 取代了。Quadlet 是在 podman 4.4 的時候整合進去的,利用 systemd generator 的方式把類似於 systemd 的設定檔直接轉換為 systemd 可以使用的格式。

# cat /etc/containers/systemd/wordpress.container
[Unit]
Description=Wordpress Container
After=network-online.target
Wants=network-online.target

[Container]
Image=docker.io/library/wordpress:6
Volume=/var/srv/wordpress:/var/www/html:Z

[Service]
Restart=always
TimeoutStartSec=900

[Install]
WantedBy=multi-user.target

如此一來就可以簡單的設定 container 以及讓 container 自動更新了。詳細的設定可以參考 podman-systemd.unit(5) 的內容。

把設定放到 /etc/containers/systemd 目錄下以後,記得要讓 systemd 重新讀取:

# sudo systemctl daemon-reload
# sudo systemctl start wordpress
# systemctl status wordpress
 wordpress.service - WordPress Container
     Loaded: loaded (/etc/containers/systemd/wordpress.container; generated)
    Drop-In: /usr/lib/systemd/system/service.d
             └─10-timeout-abort.conf
     Active: active (running) since Sun 2023-11-05 03:07:06 UTC; 20h ago
   Main PID: 57888 (conmon)
      Tasks: 5 (limit: 2032)
     Memory: 212.2M
        CPU: 4min 34.751s
     CGroup: /system.slice/wordpress.service
             ├─libpod-payload-739aab67986c96c
              ├─57890 apache2 -DFOREGROUND
              ├─74394 apache2 -DFOREGROUND
              ├─74399 apache2 -DFOREGROUND
              └─74407 apache2 -DFOREGROUND
             └─runtime
               └─57888 /usr/bin/conmon --api-version 1 -c 739aab67986c96c

這一種設定方式比原本的 systemd 簡單太多了。▗