名称

podman-auto-update - 根据其自动更新策略自动更新容器

简介

podman auto-update [options]

描述

podman auto-update 下载新的容器镜像并重新启动配置为自动更新的容器。要使用自动更新,容器或 Kubernetes 工作负载必须在 systemd 单元内运行。成功更新镜像后,使用该镜像的容器将通过重新启动它们运行的 systemd 单元进行更新。有关如何在 systemd 下运行 Podman,请参阅 podman-quadlet(7)

要配置容器进行自动更新,必须使用 io.containers.autoupdate 标签或 podman-quadlet(7) 中的 AutoUpdate 字段创建它,并设置以下两个值之一

  • registry: 如果标签存在并设置为 registry,Podman 将联系相应的注册表以检查镜像是否已更新。标签 imageregistry 的替代,用于向后兼容。如果本地存储中的摘要与远程镜像的摘要不同,则认为镜像已更新。如果镜像必须更新,Podman 将其下载并重新启动执行容器的 systemd 单元。注册表策略要求使用完全限定的镜像引用(例如,quay.io/podman/stable:latest)来创建容器。此强制措施对于知道实际要检查和拉取的镜像是必要的。如果使用了镜像 ID,Podman 将不再知道要检查/拉取哪个镜像。

  • local: 如果自动更新标签设置为 local,Podman 会将容器的镜像摘要与本地容器存储中的镜像摘要进行比较。如果它们不同,则认为本地镜像较新,并且 systemd 单元将重新启动。

自动更新和 Kubernetes YAML

Podman 支持 Kubernetes 工作负载的自动更新。自动更新策略可以直接通过 podman-quadlet(7) 配置,或者在 Kubernetes YAML 中使用下面提到的 Podman 特定注解进行配置

  • io.containers.autoupdate: “registry|local” 以将自动更新策略应用于所有容器

  • io.containers.autoupdate/$container: “registry|local” 仅将自动更新策略应用于 $container

  • io.containers.sdnotify: “conmon|container” 以将 sdnotify 策略应用于所有容器

  • io.containers.sdnotify/$container: “conmon|container” 仅将 sdnotify 策略应用于 $container

默认情况下,自动更新策略设置为“disabled”,sdnotify 策略设置为“conmon”。

Systemd 单元和计时器

Podman 附带一个 podman-auto-update.service systemd 单元。此单元由 podman-auto-update.timer systemd 计时器每天午夜触发。如果需要,可以更改计时器以进行自定义基于时间的更新。该单元还可以由其他 systemd 单元(例如,通过依赖树)或通过 systemctl start podman-auto-update.service 手动调用。

选项

--authfile=path

认证文件的路径。在 Linux 上默认为 ${XDG_RUNTIME_DIR}/containers/auth.json,在 Windows/macOS 上默认为 $HOME/.config/containers/auth.json。该文件由 podman login 创建。如果在此处找不到授权状态,则检查 $HOME/.docker/config.json,该文件是使用 docker login 设置的。

注意:还可以通过设置 REGISTRY_AUTH_FILE 环境变量来覆盖认证文件的默认路径。这可以通过 export REGISTRY_AUTH_FILE=path 来完成。

或者,可以配置 io.containers.autoupdate.authfile 容器标签。在这种情况下,Podman 将使用指定标签的值。

--dry-run

检查是否有新的镜像可用,但不要执行任何拉取操作或重新启动任何服务或容器。UPDATED 字段通过“pending”表示新镜像的可用性。

--format=格式

更改默认输出格式。这可以是受支持的类型,如“json”,也可以是 Go 模板。Go 模板的有效占位符如下所示

占位符

描述

.Container

容器的 ID 和名称

.ContainerID

容器的 ID

.ContainerName

容器的名称

.Image

镜像的名称

.Policy

容器的自动更新策略

.Unit

systemd 单元的名称

.Updated

更新状态:true,false,failed,pending

--rollback

如果更新镜像后重新启动 systemd 单元失败,则回滚到使用以前的镜像并再次重新启动该单元。默认为 true。

请注意,检测 systemd 单元是否失败最好由容器通过 SDNOTIFY 发送 READY 消息来完成。这样,重新启动单元将等待收到消息或超时。否则,即使容器在短时间后失败,重新启动 systemd 单元也可能成功。

要使容器通过 SDNOTIFY 发送 READY 消息,必须使用 --sdnotify=container 选项创建它(参见 podman-run(1))。容器内运行的应用程序可以在准备就绪时执行 systemd-notify --ready,或者使用特定编程语言的 sdnotify 绑定(例如,sd_notify(3))。

--tls-verify

联系注册表时需要 HTTPS 并验证证书(默认值:true)。如果明确设置为 true,则使用 TLS 验证。如果设置为 false,则不使用 TLS 验证。如果未指定,则使用 TLS 验证,除非目标注册表在 containers-registries.conf(5) 中列为不安全的注册表

示例

创建配置为自动更新的 Quadlet 文件

$ cat ~/.config/containers/systemd/sleep.container
[Container]
Image=registry.fedoraproject.org/fedora:latest
Exec=sleep infinity
AutoUpdate=registry

通过重新加载 systemd 用户守护程序从 Quadlet 文件生成 systemd 服务

$ systemctl --user daemon-reload

启动 systemd 服务并确保容器正在运行

$ systemctl --user start sleep.service
$ podman ps
CONTAINER ID  IMAGE                                     COMMAND         CREATED        STATUS        PORTS       NAMES
f8e4759798d4  registry.fedoraproject.org/fedora:latest  sleep infinity  2 seconds ago  Up 2 seconds              systemd-sleep

通过 --dry-run 检查是否有新的镜像可用

$ podman auto-update --dry-run --format "{{.Image}} {{.Updated}}"
registry.fedoraproject.org/fedora:latest   pending

更新服务

$ podman auto-update
UNIT           CONTAINER                     IMAGE                                     POLICY      UPDATED
sleep.service  f8e4759798d4 (systemd-sleep)  registry.fedoraproject.org/fedora:latest  registry    true

另请参阅

podman(1), podman-generate-systemd(1), podman-run(1), podman-systemd.unit(5), sd_notify(3), systemd.unit(5)