名称

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

概要

podman auto-update [选项]

描述

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

要将容器配置为自动更新,必须使用 io.containers.autoupdate 标签或 quadlet(5) 中的 AutoUpdate 字段创建容器,该字段的值可以是以下两个值之一

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

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

自动更新和 Kubernetes YAML

Podman 支持 Kubernetes 工作负载的自动更新。 自动更新策略可以通过 quadlet(5) 或通过下面提到的 Podman 特定注释在 Kubernetes YAML 中直接配置

  • 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=format

更改默认输出格式。 这可以是支持的类型,例如“json”或 Go 模板。 Go 模板的有效占位符列在下文

占位符

描述

.Container

容器的 ID 和名称

.ContainerID

容器的 ID

.ContainerName

容器的名称

.Image

镜像的名称

.Policy

容器的自动更新策略

.Unit

systemd 单元的名称

.Updated

更新状态:true、false、failed

--rollback

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

注意,检测 systemd 单元是否失败的最佳方法是容器通过 SDNOTIFY 发送 READY 消息。 这样,重启单元将等到收到消息或超时后才会进行。 如果没有,即使容器在重启 systemd 单元后不久就失败,重启 systemd 单元也可能成功。

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

--tls-verify

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

示例

创建一个配置了自动更新的 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)