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 replicationAmazon 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 结构