如何从AWS ECR拉取全部镜像(含带/无标签)并跨区域迁移?
AWS ECR跨区域复制所有镜像的解决方案
原脚本的问题在于只拉取了latest标签的镜像,没有覆盖仓库中所有带标签的镜像,也漏掉了无标签(仅通过镜像摘要存在)的镜像。下面提供两种可行的实现方法:
方法一:改进Shell脚本(覆盖所有镜像)
这个脚本会遍历源区域的每个ECR仓库,获取所有镜像的标签和摘要,逐个拉取、打标签并推送到目标区域。需要提前安装jq工具用于JSON解析。
#!/bin/bash # 配置参数 TARGET_REGION="us-west-2" # 源区域 DEST_REGION="us-east-1" # 目标区域 DEST_ACCOUNT_ID="123456" # 目标账号ID DEST_BASE_URI="${DEST_ACCOUNT_ID}.dkr.ecr.${DEST_REGION}.amazonaws.com" # 获取源区域所有ECR仓库名称 REPO_NAMES=($(aws ecr describe-repositories --region $TARGET_REGION --query 'repositories[].repositoryName' --output text)) for repo in "${REPO_NAMES[@]}"; do echo "=== 处理仓库: $repo ===" # 在目标区域创建仓库(已存在则忽略错误) aws ecr create-repository --repository-name $repo --region $DEST_REGION 2>/dev/null || echo "仓库 $repo 已存在于目标区域" # 获取当前仓库下所有镜像的ID(包含标签和摘要) IMAGES_JSON=$(aws ecr list-images --repository-name $repo --region $TARGET_REGION --query 'imageIds' --output json) # 遍历每个镜像 echo "$IMAGES_JSON" | jq -c '.[]' | while read -r image; do TAG=$(echo "$image" | jq -r '.imageTag // empty') DIGEST=$(echo "$image" | jq -r '.imageDigest') # 构建源和目标镜像地址 SRC_REPO_URI=$(aws ecr describe-repositories --repository-name $repo --region $TARGET_REGION --query 'repositories[0].repositoryUri' --output text) if [ -n "$TAG" ]; then SRC_IMAGE="${SRC_REPO_URI}:${TAG}" DEST_IMAGE="${DEST_BASE_URI}/${repo}:${TAG}" else # 无标签镜像,使用镜像摘要进行拉取和推送 SRC_IMAGE="${SRC_REPO_URI}@${DIGEST}" DEST_IMAGE="${DEST_BASE_URI}/${repo}@${DIGEST}" fi echo "拉取镜像: $SRC_IMAGE" docker pull "$SRC_IMAGE" echo "打标签: $DEST_IMAGE" docker tag "$SRC_IMAGE" "$DEST_IMAGE" echo "推送镜像: $DEST_IMAGE" docker push "$DEST_IMAGE" # 清理本地镜像,释放空间(可选) docker rmi "$SRC_IMAGE" "$DEST_IMAGE" done done
注意事项
- 执行脚本的环境需要配置好AWS凭证,且拥有源区域ECR的拉取权限、目标区域ECR的推送和仓库创建权限
- 如果目标区域的仓库已全部创建,可删除
aws ecr create-repository那一行 - 若本地磁盘空间充足,可去掉最后清理镜像的步骤
方法二:使用ECR原生跨区域复制功能(推荐)
AWS ECR提供了原生的跨区域复制能力,无需编写脚本,配置完成后自动同步所有镜像(包括后续新推送的镜像):
- 登录AWS控制台,进入源区域的ECR服务,打开目标仓库
- 切换到「复制」标签页,点击「创建复制规则」
- 配置目标:选择目标区域和目标账号(同账号直接选区域即可)
- 设置复制范围:可选择复制所有镜像、特定标签的镜像,或排除指定标签
- 完成配置后,AWS会自动同步现有镜像,后续新推送的镜像也会自动复制到目标区域
优势
- 无需维护脚本,由AWS托管同步过程
- 支持自动同步新镜像,无需手动触发
- 可配置复制规则,灵活控制要同步的镜像
内容的提问来源于stack exchange,提问作者jmrjmr
相关产品推荐
相关产品推荐

