名称¶
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 将联系相应的注册表以检查镜像是否已更新。标签image
是registry
的替代,用于向后兼容。如果本地存储中的摘要与远程镜像的摘要不同,则认为镜像已更新。如果镜像必须更新,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)