如何将ACR仓库所有镜像导入不同租户的另一ACR实例
ACR跨租户批量迁移解决方案
前置依赖
- 已在源ACR所属租户创建具备
AcrPull权限的服务主体,保存好应用ID与密码 - 已在目标ACR所属租户创建具备
AcrImport权限的身份(服务主体/当前登录账号) - 本地环境已安装Azure CLI,且可正常访问两个ACR的网络
批量导入方案(Shell脚本实现)
该方案通过循环拉取源ACR的仓库、标签列表,批量调用az acr import命令完成全量迁移,支持保留原仓库名、标签名,不需要本地拉取镜像再推送,迁移效率更高。
脚本示例如下:
# 1. 替换为实际环境配置 SOURCE_REGISTRY_DOMAIN="sourceregistry.azurecr.io" # 源ACR访问域名 TARGET_REGISTRY_NAME="myregistry" # 目标ACR名称(不需要加.azurecr.io后缀) SOURCE_SP_APP_ID="<你的源租户服务主体应用ID>" SOURCE_SP_PASSWORD="<你的源租户服务主体密码>" # 2. 配置要迁移的仓库列表,如需迁移源ACR所有仓库,可直接注释下行,启用下下行自动拉取 MIGRATE_REPOS=("repo1" "repo2" "repo3" "repo4") # MIGRATE_REPOS=($(az acr repository list --name ${SOURCE_REGISTRY_DOMAIN%%.*} --username $SOURCE_SP_APP_ID --password $SOURCE_SP_PASSWORD -o tsv)) # 3. 循环迁移每个仓库的所有标签 for REPO in "${MIGRATE_REPOS[@]}" do # 拉取当前仓库所有标签 TAG_LIST=$(az acr repository show-tags --name ${SOURCE_REGISTRY_DOMAIN%%.*} --repository $REPO --username $SOURCE_SP_APP_ID --password $SOURCE_SP_PASSWORD -o tsv) for TAG in $TAG_LIST do echo "开始迁移镜像:${REPO}:${TAG}" az acr import \ --name $TARGET_REGISTRY_NAME \ --source ${SOURCE_REGISTRY_DOMAIN}/${REPO}:${TAG} \ --image ${REPO}:${TAG} \ --username $SOURCE_SP_APP_ID \ --password $SOURCE_SP_PASSWORD # 可自行添加异常重试、迁移成功校验逻辑 done done
常见问题优化
- 如果镜像数量超过1000个,可在脚本中加入并发控制,避免调用API被限流
- 注:如果源ACR配置了IP访问限制,需要将运行脚本的客户端公网IP添加到源ACR的允许访问列表中
- 如需修改目标端的仓库名、标签前缀,只需修改
--image参数的取值即可,比如要加前缀migrated/,可改为--image migrated/${REPO}:${TAG}
内容的提问来源于stack exchange,提问作者Pankaj Devrani
相关产品推荐
相关产品推荐

