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 识别新的配置文件,然后启动服务并设置开机自启。
重载 systemd 管理器配置:
systemctl daemon-reload启动并设置自启:
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 会输出更新日志,哪些容器被检查了,哪些更新成功了,哪些没有变化。