AWS ECR Repository - 如何从一个账户复制图像并推送到另一个账户

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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,因此它不再准确。有关更多信息,请参阅 ***.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

或者你可以使用其中之一

AWS 跨区域复制 Cross account replication

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

【讨论】:

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

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

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

【讨论】:

以上是关于AWS ECR Repository - 如何从一个账户复制图像并推送到另一个账户的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AWS-ECR 中为 docker 映像使用环境变量?

如何通过 AWS EKS 在 ECR 中使用 Docker 映像

AWS CodePipeline:如何使 CodeBuild 构建的 ECR 映像作为剩余阶段的工件?

ECR 存储库的 Dockerrun.aws.json 结构

来自 AWS ECR 的 Jenkins 管道 Docker 代理

如何从 AWS ECR Container Registry 中删除未标记的图像