Podman推送镜像至ECR时如何保留多架构manifest list
问题根因
podman pull默认只会拉取当前主机对应架构的单架构镜像到本地,执行podman tag时,绑定的是本地存储的单架构镜像实例,并不会关联源镜像的完整多架构manifest列表,所以最后推送到仓库的只有当前主机架构(当前环境为amd64)的单版本镜像,自然无法在其他架构主机上运行。
之前能查到源镜像的多架构manifest,是podman缓存了远端的manifest信息,不代表本地存储了所有架构的镜像层和对应的清单关联关系。
操作步骤
- 先清理本地之前错误生成的目标标签镜像,避免缓存干扰:
podman rmi $MY_REGISTRY/alpine:latest
- 创建指向目标仓库地址的多架构manifest清单,直接关联源镜像的所有架构条目,不需要走普通tag流程:
podman manifest create $MY_REGISTRY/alpine:latest docker.io/library/alpine:latest
- 验证本地manifest清单完整性,执行下列命令后如果能看到和源alpine一致的多架构条目、没有单镜像告警,就说明配置正确:
podman manifest inspect $MY_REGISTRY/alpine:latest
- 推送时必须加
--all参数,让podman把完整manifest list和关联的所有架构镜像层一起推送到ECR仓库:
podman push --all $MY_REGISTRY/alpine:latest
补充说明
- 批量搬运多架构镜像时,所有镜像都要走上述manifest创建+全量推送的流程,普通tag操作无法保留多架构属性。
- 如果是自行构建的多架构镜像,可以用
podman manifest add把不同架构编译好的单镜像逐个加到manifest清单里,再用--all参数推送即可。 - 推送完成后可以在arm、ppc64le等其他架构主机上拉取验证,容器运行时会自动匹配对应架构的镜像层。
内容的提问来源于stack exchange,提问作者hosselausso
相关产品推荐
相关产品推荐

