跳到主要内容

podman 自动更新

摘要

podman 自动更新 [选项]

描述

podman 自动更新 根据自动更新配置拉取新的容器镜像并重启容器。 要使用自动更新功能,容器或Kubernetes工作负载必须在systemd单元中运行。 成功更新镜像后,使用镜像的容器将通过重启它们运行的systemd单元来更新。 请参考quadlet(5)以了解如何在systemd下运行Podman。

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

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

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

自动更新和Kubernetes YAML

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

  • io.containers.autoupdate:设置为"registry"或"local",以将所有容器的自动更新策略应用为全局设置
  • io.containers.autoupdate/$container:为特定容器$container设置"registry"或"local"的自动更新策略
  • io.containers.sdnotify:设置为"conmon"或"container",以应用所有容器的sdnotify策略
  • io.containers.sdnotify/$container:为特定容器$container设置"conmon"或"container"的sdnotify策略

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

Systemd 单元和计时器

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

选项

@@option authfile

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

--dry-run

检查新镜像的可用性,但不执行任何拉取操作或重启任何服务或容器。 UPDATED字段将用"pending"指示新镜像的可用性。

--format=format

改变默认的输出格式。这可以是像 'json' 这样的支持类型,或者是一个 Go 模板。 Go 模板的有效占位符如下:

占位符描述
.Container容器的 ID 和名称
.ContainerID容器的 ID
.ContainerName容器的名称
.Image镜像的名称
.Policy容器的自动更新策略
.Unitsystemd 单元的名称
.Updated更新状态:true, false, failed

--rollback

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

请注意,检测 systemd 单元是否失败的最佳方法是通过容器发送 READY 消息通过 SDNOTIFY。 这样,重启单元会等待收到消息或超时触发。 如果没有这样做,重启 systemd 单元可能会成功,即使容器在短暂时间后失败。

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

@@option tls-verify 翻译:

--tls-verify

此选项用于验证与远程 Podman 服务或仓库的连接是否使用了有效的 TLS 证书。当启用时,Podman 会检查服务器的 TLS 证书是否有效和可信,以确保连接的安全性。这有助于防止中间人攻击和其他安全威胁。

如果未启用此选项,Podman 将不会验证服务器的 TLS 证书,这可能会使连接容易受到安全漏洞的影响。因此,在大多数情况下,建议启用 --tls-verify 选项以确保连接的安全性。

注意:在使用 --tls-verify 选项时,还需要提供正确的 TLS 证书和密钥文件,以便 Podman 能够正确验证服务器的身份。这些文件通常通过其他选项(如 --tls-cert-path)指定。

示例

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

这些文档提供了关于 Podman 及其相关工具的详细信息。podman(1) 是 Podman 的主命令文档,podman-generate-systemd(1) 是用于生成 systemd 服务文件的工具,podman-run(1) 用于启动新的容器,podman-systemd.unit(5) 提供了 Podman systemd 单元的详细说明。此外,sd_notify(3) 是用于 systemd 的系统调用文档,而 systemd.unit(5) 是 systemd 单元的通用文档。