Podman 提供了一个非常实用的功能 podman auto-update,它可以配合 systemd 自动下载新的容器镜像并重启相应的容器。

要使用 Podman 的自动更新功能,必须满足两个核心条件:

1. 容器必须由 Systemd 管理:容器或 Kubernetes 工作负载必须在 systemd 单元内运行。

2. 特定的标签:创建容器时必须打上 io.containers.autoupdate=registry 的标签,告诉 Podman 该容器需要检查镜像更新。

其工作流程如下podman auto-update 会定期检查远程镜像仓库是否有新版本。如果发现新镜像,它会下载该镜像,然后重启运行该容器的 systemd 单元,从而完成更新。

配置步骤

第一步:创建并运行带自动更新标签的容器

在使用 podman run 创建容器时,必须添加 --label "io.containers.autoupdate=registry" 标签。

例如,要运行一个名为 my-nginx 的 Nginx 容器:

podman run -d \
  --name my-nginx \
  --label "io.containers.autoupdate=registry" \
  nginx:latest

第二步:生成 Systemd 单元文件

为了让容器由 systemd 接管,需要使用 podman generate systemd 命令生成对应的 service 文件。推荐使用 --new 参数,这样在更新时会停止并移除旧容器,再启动一个新容器,确保环境干净。

podman generate systemd --new --name my-nginx > /etc/systemd/system/container-my-nginx.service

第三步:重载并启动服务

生成文件后,需要让 systemd 识别新的配置文件,然后启动服务并设置开机自启。

  1. 重载 systemd 管理器配置:

    systemctl daemon-reload
  2. 启动并设置自启:

    systemctl enable container-my-nginx.service --now

自动更新机制

Podman 安装时会默认携带一个定时器单元 podman-auto-update.timer。正是它在后台默默工作,定期触发 podman auto-update 命令。

可以通过以下命令查看其配置内容:

cat /lib/systemd/system/podman-auto-update.timer

配置解析:

[Unit]
Description=Podman auto-update timer

[Timer]
OnCalendar=daily        # 每天触发一次
RandomizedDelaySec=900  # 为了避免所有机器同时冲击镜像仓库,增加 0-900 秒的随机延迟
Persistent=true         # 如果机器在计划执行时间关机,开机后会立即补执行

[Install]
WantedBy=timers.target

默认情况下,这个定时器是未启用的。要启用自动更新,需要启动这个 timer:

systemctl enable podman-auto-update.timer --now

手动执行更新

除了依赖定时器每天触发外,也可以随时随地手动执行更新命令,立即检查并更新所有符合条件的容器。

手动执行更新:

podman auto-update

执行后,Podman 会输出更新日志,哪些容器被检查了,哪些更新成功了,哪些没有变化。