如何将容器镜像的所有标签镜像同步到另一registry或命名空间
容器镜像全标签同步/迁移实现方案
核心逻辑统一为「拉取源镜像全标签→批量重打目标标签→循环推送所有标签」,Podman和Docker原生均没有直接的全标签推送命令,通过脚本循环即可实现需求。
操作步骤
1. 拉取源镜像全部标签
- Podman环境直接使用内置参数:
podman pull --all-tags <源registry地址>/<源镜像名称>
如果源是Docker Hub可以省略registry地址 - Docker环境没有内置
--all-tags参数,先拉取标签列表再循环拉取:
# 获取源镜像所有标签 tags=$(docker search --list-tags <源registry地址>/<源镜像名称> --format "{{.Name}}" | cut -d ":" -f 2) # 循环拉取所有标签 for tag in $tags; do docker pull <源registry地址>/<源镜像名称>:$tag; done
2. 批量重打目标镜像标签
以Podman为例,Docker替换命令前缀即可:
# 获取源镜像所有本地标签 tags=$(podman images <源registry地址>/<源镜像名称> --format "{{.Tag}}") # 循环打新标签 for tag in $tags; do podman tag <源registry地址>/<源镜像名称>:$tag <目标registry地址>/<目标镜像名称>:$tag; done
如果是推送到同registry下的不同镜像名称,只需要替换镜像名称部分即可
3. 批量推送全部标签
同样循环处理即可,Podman示例:
tags=$(podman images <目标registry地址>/<目标镜像名称> --format "{{.Tag}}") for tag in $tags; do podman push <目标registry地址>/<目标镜像名称>:$tag; done
操作前需要先通过podman login/docker login分别登录源和目标镜像仓库,完成权限认证
通用一键脚本
适配Podman和Docker双环境,修改头部配置即可直接使用:
#!/bin/bash # 自定义配置项 SOURCE_REGISTRY="" # 源registry地址,Docker Hub留空即可 SOURCE_IMAGE="nginx" # 源镜像名 TARGET_REGISTRY="registry.example.com" # 目标registry地址,同registry留空 TARGET_IMAGE="my-nginx" # 目标镜像名 RUNTIME="podman" # 可选值 podman / docker # 1. 拉取源镜像全标签 if [ "$RUNTIME" = "podman" ]; then $RUNTIME pull --all-tags ${SOURCE_REGISTRY:+${SOURCE_REGISTRY}/}${SOURCE_IMAGE} else tags=$($RUNTIME search --list-tags ${SOURCE_REGISTRY:+${SOURCE_REGISTRY}/}${SOURCE_IMAGE} --format "{{.Name}}" | cut -d ":" -f 2) for tag in $tags; do $RUNTIME pull ${SOURCE_REGISTRY:+${SOURCE_REGISTRY}/}${SOURCE_IMAGE}:$tag; done fi # 2. 批量重打标签 tags=$($RUNTIME images ${SOURCE_REGISTRY:+${SOURCE_REGISTRY}/}${SOURCE_IMAGE} --format "{{.Tag}}") for tag in $tags; do $RUNTIME tag ${SOURCE_REGISTRY:+${SOURCE_REGISTRY}/}${SOURCE_IMAGE}:$tag ${TARGET_REGISTRY:+${TARGET_REGISTRY}/}${TARGET_IMAGE}:$tag done # 3. 批量推送目标标签 for tag in $tags; do $RUNTIME push ${TARGET_REGISTRY:+${TARGET_REGISTRY}/}${TARGET_IMAGE}:$tag done
优化建议
- 不需要保留本地镜像的场景,可以在推送完成后加一步批量删除本地镜像的命令,节省存储空间
- 大镜像/大批量镜像同步场景,可以使用skopeo工具实现免本地落地的直接跨仓库同步,传输效率更高
内容的提问来源于stack exchange,提问作者sorin
相关产品推荐
相关产品推荐

