【问题标题】:AWS ECR Repository - How to copy images from one account and push to another accountAWS ECR Repository - 如何从一个账户复制图像并推送到另一个账户
【发布时间】:2020-10-31 12:49:51
【问题描述】:

我有两个帐户 - 帐户 A 和帐户 B。在帐户 A 中,我有一个策略,帐户 B 中的用户可以与帐户 A 交互。我在两个帐户中都有一个存储库。帐户 B 没有设置策略(不确定我是否需要帐户 A 与之交互的策略)。

我的问题是如何将帐户 A 中的 ecr 图像推送到帐户 B。我想要帐户 A 图像的副本到帐户 B。这可能吗?

【问题讨论】:

    标签: amazon-web-services docker amazon-ecr


    【解决方案1】:

    这不是当前支持的 ECR 功能,因此您需要执行以下步骤才能从一个帐户迁移到另一个帐户:

    • aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com - 为源帐户运行此命令
    • docker pull $SOURCE_IMAGE:$VERSION - 将最新标签拉到您的本地
    • docker tag $SOURCE_IMAGE:$VERSION $TARGET_IMAGE:$VERSION - Tag 基于原始源图像的新图像
    • aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com - 为目标帐户运行此命令
    • docker push $TARGET_IMAGE:$VERSION - Push docker 镜像到目标 ECR 帐户。

    【讨论】:

    • 谢谢!我会试一试的!
    • 需要在de docker login命令前添加管道,例如:aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com
    • 糟糕,感谢您的指出。调整评论@Edenshaw
    • 请注意,虽然这仍然是公认的答案 (@paris),但由于 AWS 在 2020 年 12 月将此功能添加到 ECR,因此它不再准确。有关更多信息,请参阅 stackoverflow.com/a/67671301/149428
    【解决方案2】:

    如果您想将所有存储库从特定区域移动到另一个帐户(目标帐户),请使用以下脚本。

    • 它将列出来自帐户 A 的所有 repo
    • 从帐户 A 中一张一张拉出一张图片
    • 在账户 B 中创建回购
    • 标签图片
    • 将图片推送到帐号 B
    #!/bin/bash
    TARGET_ACCOUNT_REGION="us-west-2"
    DESTINATION_ACCOUNT_REGION="us-west-2"
    DESTINATION_ACCOUNT_BASE_PATH="123456.dkr.ecr.$DESTINATION_ACCOUNT_REGION.amazonaws.com/"
    
    
    REPO_LIST=($(aws ecr describe-repositories --query 'repositories[].repositoryUri' --output text --region $TARGET_ACCOUNT_REGION))
    REPO_NAME=($(aws ecr describe-repositories --query 'repositories[].repositoryName' --output text --region $TARGET_ACCOUNT_REGION))
    
    
    for repo_url in ${!REPO_LIST[@]}; do
            echo "star pulling image ${REPO_LIST[$repo_url]} from Target account"
            docker pull ${REPO_LIST[$repo_url]}
    
    
            # Create repo in destination account, remove this line if already created
            aws ecr create-repository --repository-name ${REPO_NAME[$repo_url]}
            docker tag   ${REPO_LIST[$repo_url]} $DESTINATION_ACCOUNT_BASE_PATH/${REPO_NAME[$repo_url]} 
            docker push $DESTINATION_ACCOUNT_BASE_PATH/${REPO_NAME[$repo_url]} 
    done
    

    确保您已获得两个帐户的登录令牌或在脚本中添加这些命令。

            aws ecr get-login-password --region $TARGET_ACCOUNT_REGION | docker login --username AWS --password-stdin ${REPO_LIST[$repo_url]}
            # destination account login, make sure profile set for accoutn destination
            aws ecr get-login-password --region $DESTINATION_ACCOUNT_REGION --profile destination_account | docker login --username AWS --password-stdin ${REPO_LIST[$repo_url]}
    

    aws-cli-cheatsheet

    或者你可以使用其中之一

    Amazon ECR 使用注册表设置在 注册表级别。已配置私有注册表设置 分别为每个区域。目前,唯一的注册表设置是 复制设置,用于配置跨区域和 跨帐户复制存储库中的图像

    【讨论】:

    • docker pull ${REPO_LIST[$repo_url]} 我很困惑:这不会只是从每个回购中提取“最新”图像吗?问题不就是如何将所有图像从 A 复制到 B 吗?
    • 是的,它会复制所有带有“最新”标签的图像
    【解决方案3】:

    AWS 中的跨区域/账户复制功能

    AWS已经推出CRR(跨区域复制)和CAR(跨账户复制)Click here for more info

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-07
      • 1970-01-01
      • 2020-05-19
      • 1970-01-01
      • 1970-01-01
      • 2020-01-18
      相关资源
      最近更新 更多