You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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提供了原生的跨区域复制能力,无需编写脚本,配置完成后自动同步所有镜像(包括后续新推送的镜像):

  1. 登录AWS控制台,进入源区域的ECR服务,打开目标仓库
  2. 切换到「复制」标签页,点击「创建复制规则」
  3. 配置目标:选择目标区域和目标账号(同账号直接选区域即可)
  4. 设置复制范围:可选择复制所有镜像、特定标签的镜像,或排除指定标签
  5. 完成配置后,AWS会自动同步现有镜像,后续新推送的镜像也会自动复制到目标区域

优势

  • 无需维护脚本,由AWS托管同步过程
  • 支持自动同步新镜像,无需手动触发
  • 可配置复制规则,灵活控制要同步的镜像

内容的提问来源于stack exchange,提问作者jmrjmr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 10:42:47