名称¶
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)