

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 将容器镜像从一个存储库复制到另一个存储库
<a name="copy-image-to-repository"></a>

本主题介绍如何从节点无权访问的存储库中提取容器镜像，然后将该镜像推送到节点有权访问的存储库。您可以将镜像推送到 Amazon ECR 或节点有权访问的备用存储库。
+ 已在计算机上安装并配置 Docker 引擎。有关说明，请参阅 Docker 文档中的[安装 Docker 引擎](https://docs.docker.com/engine/install/)。
+ 在您的设备或 AWS CloudShell 上安装和配置 AWS 命令行界面（AWS CLI）的版本 `2.12.3` 或更高版本，或版本 `1.27.160` 或更高版本。要查看当前版本，请使用 `aws --version | cut -d / -f2 | cut -d ' ' -f1`。`yum`、`apt-get` 或适用于 macOS 的 Homebrew 等软件包管理器通常比 AWS CLI 的最新版本落后几个版本。要安装最新版本，请参阅《AWS 命令行界面用户指南》**中的[安装](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)和[使用 aws configure 快速配置](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)。AWS CloudShell 中安装的 AWS CLI 版本也可能比最新版本落后几个版本。要对其进行更新，请参阅《AWS CloudShell 用户指南》**中的[将 AWS CLI 安装到您的主目录](https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html#install-cli-software)。
+ 如果您希望节点通过 Amazon 的网络从私有 Amazon ECR 存储库中提取容器镜像或将容器镜像推送到私有 Amazon ECR 存储库，请为 Amazon ECR 创建接口 VPC 端点。有关更多信息，请参阅 Amazon Elastic Container Registry 用户指南中的[为 Amazon ECR 创建 VPC 端点](https://docs.aws.amazon.com/AmazonECR/latest/userguide/vpc-endpoints.html#ecr-setting-up-vpc-create)。

请完成以下步骤，以从存储库中提取容器镜像并将其推送到自己的存储库。在本主题提供的以下示例中，将提取 [Kubernetes 指标帮助程序的 Amazon VPC CNI 插件](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/cmd/cni-metrics-helper/README.md)的映像。按照这些步骤操作时，请确保将示例值替换为您自己的值。

1. 如果您还没有 Amazon ECR 存储库或其它存储库，请创建一个节点可以访问的存储库。以下命令将创建一个 Amazon ECR 私有存储库。Amazon ECR 私有存储库的名称必须以字母开头。它只能包含小写字母、数字、连字符 (-)、下划线 (\$1) 和正斜杠 (/)。有关更多信息，请参阅 Amazon Elastic Container Registry 用户指南中的[创建私有存储库](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)。

   您可以将 *cni-metrics-helper* 替换为所选的任何内容。作为最佳实践，请为每个镜像创建单独的存储库。我们建议您这样做，因为镜像标签在存储库中必须唯一。请将 *region-code* 替换为 [Amazon ECR 支持的 AWS 区域](https://docs.aws.amazon.com/general/latest/gr/ecr.html)。

   ```
   aws ecr create-repository --region region-code --repository-name cni-metrics-helper
   ```

1. 请确定节点需要提取的镜像的注册表、存储库和标签（可选）。此信息采用 `registry/repository[:tag]` 格式。

   许多关于安装镜像的 Amazon EKS 主题都要求您应用清单文件或使用 Helm 图表安装镜像。但是，在应用清单文件或安装 Helm 图表之前，请先查看清单或图表 `values.yaml` 文件的内容。这样您就可以确定要提取的注册表、存储库和标签。

   例如，您可以在 [Kubernetes 指标帮助程序的 Amazon VPC CNI 插件](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/cmd/cni-metrics-helper/README.md)的[清单文件](https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/v1.12.6/config/master/cni-metrics-helper.yaml)中找到以下行。`602401143452.dkr.ecr.us-west-2.amazonaws.com` 注册表是 Amazon ECR 私有注册表。存储库是 `cni-metrics-helper`。

   ```
   image: "602401143452.dkr.ecr.us-west-2.amazonaws.com/cni-metrics-helper:v1.12.6"
   ```

   您可能会看到镜像位置的以下变体：
   + 仅限 `repository-name:tag`。在本例中，`docker.io` 通常是未指定的注册表，因为如果没有指定注册表，默认情况下 Kubernetes 会将它置于存储库名称前面。
   +  `repository-name/repository-namespace/repository:tag`。存储库命名空间为可选，但有时由存储库所有者指定以用于对镜像进行分类。例如，[Amazon ECR 公开映像浏览馆中的所有 Amazon EC2 镜像](https://gallery.ecr.aws/aws-ec2/)都使用 `aws-ec2` 命名空间。

     在使用 Helm 安装镜像之前，请查看 Helm `values.yaml` 文件以确定镜像位置。例如，[Kubernetes 指标帮助程序的 Amazon VPC CNI 插件](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/cmd/cni-metrics-helper/README.md)的 [values.yaml](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/charts/cni-metrics-helper/values.yaml#L5-L9) 文件包括以下行。

     ```
     image:
       region: us-west-2
       tag: v1.12.6
       account: "602401143452"
       domain: "amazonaws.com"
     ```

1. 请提取清单文件中指定的容器镜像。

   1. 如果从公有注册表中提取，例如 [Amazon ECR 公开映像浏览馆](https://gallery.ecr.aws/)，则可以跳到下一个子步骤，因为不需要身份验证。在此示例中，您可以对包含 CNI 指标帮助程序映像存储库的 Amazon ECR 私有注册表进行身份验证。Amazon EKS 在[查看 Amazon EKS 附加组件的 Amazon 容器映像注册表](add-ons-images.md)中所列的每个注册表中维护映像。通过将 *602401143452* 和 *region-code* 替换为其它注册表的信息，您可以向任何注册表进行身份验证。[支持 Amazon EKS 的每个 AWS 区域](https://docs.aws.amazon.com/general/latest/gr/eks.html#eks_region)都存在一个单独的注册表。

      ```
      aws ecr get-login-password --region region-code | docker login --username AWS --password-stdin 602401143452.dkr.ecr.region-code.amazonaws.com
      ```

   1. 提取镜像。在此示例中，您从上一个子步骤中进行身份验证的注册表中提取。将 *602401143452* 和 *region-code* 替换为您在上一个子步骤中提供的信息。

      ```
      docker pull 602401143452.dkr.ecr.region-code.amazonaws.com/cni-metrics-helper:v1.12.6
      ```

1. 请使用您的注册表、存储库和标签来标记提取的镜像。以下示例假设您从清单文件中提取镜像，然后将其推送到您在第一步中创建的 Amazon ECR 私有存储库。请将 *111122223333* 替换为您的账户 ID。将 *region-code* 替换为您在其中创建 Amazon ECR 私有存储库的 AWS 区域。

   ```
   docker tag cni-metrics-helper:v1.12.6 111122223333.dkr.ecr.region-code.amazonaws.com/cni-metrics-helper:v1.12.6
   ```

1. 对注册表进行身份验证。在此示例中，您可以对在第一步中创建的 Amazon ECR 私有注册表进行身份验证。有关更多信息，请参阅 Amazon Elastic Container Registry 用户指南中的[注册表身份验证](https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html#registry_auth)。

   ```
   aws ecr get-login-password --region region-code | docker login --username AWS --password-stdin 111122223333.dkr.ecr.region-code.amazonaws.com
   ```

1. 将镜像推送到存储库。在此示例中，您将镜像推送到在第一步中创建的 Amazon ECR 私有存储库。有关更多信息，请参阅 Amazon Elastic Container Registry 用户指南中的[推送 Docker 镜像](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-ecr-image.html)。

   ```
   docker push 111122223333.dkr.ecr.region-code.amazonaws.com/cni-metrics-helper:v1.12.6
   ```

1. 请使用您推送的镜像 `registry/repository:tag` 来更新在上一步中用于确定镜像的清单文件。如果您使用 Helm 图表进行安装，通常可以选择指定 `registry/repository:tag`。安装图表时，请为您推送到存储库的镜像指定 `registry/repository:tag`。