将容器镜像从一个存储库复制到另一个存储库 - Amazon EKS

将容器镜像从一个存储库复制到另一个存储库

本主题介绍如何从节点无权访问的存储库中提取容器镜像,然后将该镜像推送到节点有权访问的存储库。您可以将镜像推送到 Amazon ECR 或节点有权访问的备用存储库。

先决条件
  • 您的计算机上安装和配置的 Docker 引擎。有关说明,请参阅 Docker 文档中的安装 Docker 引擎

  • 在您的设备或 AWS CloudShell 上安装和配置了 AWS Command Line Interface(AWS CLI)的版本 2.12.3 或更高版本,或版本 1.27.160 或更高版本。要查看当前版本,请使用 aws --version | cut -d / -f2 | cut -d ' ' -f1。软件包管理器(如 yumapt-get 或适用于 macOS 的 Homebrew)通常比 AWS CLI 的最新版本落后几个版本。要安装最新版本,请参阅《AWS Command Line Interface 用户指南》中的安装、更新和卸载 AWS CLI,以及使用 aws configure 快速配置。AWS CloudShell 中安装的 AWS CLI 版本也可能比最新版本落后几个版本。如需更新,请参阅《AWS CloudShell 用户指南》中的将 AWS CLI 安装到主目录

  • 如果您希望节点通过 Amazon 的网络从私有 Amazon ECR 存储库中提取容器镜像或将容器镜像推送到私有 Amazon ECR 存储库,请为 Amazon ECR 创建接口 VPC 端点。有关更多信息,请参阅 Amazon Elastic Container Registry 用户指南中的为 Amazon ECR 创建 VPC 端点

请完成以下步骤,以从存储库中提取容器镜像并将其推送到自己的存储库。在本主题提供的以下示例中,将提取 Amazon VPC CNI plugin for Kubernetes 指标帮助程序的映像。按照这些步骤操作时,请确保将 example values 替换为您自己的值。

将容器镜像从一个存储库复制到另一个存储库
  1. 如果您还没有 Amazon ECR 存储库或其他存储库,请创建一个节点可以访问的存储库。以下命令将创建一个 Amazon ECR 私有存储库。Amazon ECR 私有存储库的名称必须以字母开头。它只能包含小写字母、数字、连字符 (-)、下划线 (_) 和正斜杠 (/)。有关更多信息,请参阅 Amazon Elastic Container Registry 用户指南中的创建私有存储库

    您可以将 cni-metrics-helper 替换为您选择的任何名称。作为最佳实践,请为每个镜像创建单独的存储库。我们建议您这样做,因为镜像标签在存储库中必须唯一。region-code 替换为 Amazon ECR 支持的 AWS 区域

    aws ecr create-repository --region region-code --repository-name cni-metrics-helper
  2. 请确定节点需要提取的镜像的注册表、存储库和标签(可选)。此信息采用 registry/repository[:tag] 格式。

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

    例如,您可以在 Amazon VPC CNI plugin for Kubernetes 指标帮助程序清单文件中找到以下行。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 Public Gallery 中的所有 Amazon EC2 镜像都使用 aws-ec2 命名空间。

    在使用 Helm 安装镜像之前,请查看 Helm values.yaml 文件以确定镜像位置。例如,Amazon VPC CNI plugin for Kubernetes 指标帮助程序values.yaml 文件包括以下行。

    image: region: us-west-2 tag: v1.12.6 account: "602401143452" domain: "amazonaws.com"
  3. 请提取清单文件中指定的容器镜像。

    1. 如果从公有注册表中提取,例如 Amazon ECR Public Gallery,则可以跳到下一个子步骤,因为不需要身份验证。在此示例中,您可以对包含 CNI 指标帮助程序映像存储库的 Amazon ECR 私有注册表进行身份验证。Amazon EKS 在 Amazon 容器镜像注册表 中所列的每个注册表中维护映像。通过将 602401143452region-code 替换为其他注册表的信息,您可以对任何注册表进行身份验证。支持 Amazon EKS 的每个AWS 区域 都存在一个单独的注册表

      aws ecr get-login-password --region region-code | docker login --username AWS --password-stdin 602401143452.dkr.ecr.region-code.amazonaws.com
    2. 提取镜像。在此示例中,您从上一个子步骤中进行身份验证的注册表中提取。602401143452region-code 替换为您在上一个子步骤中提供的信息。

      docker pull 602401143452.dkr.ecr.region-code.amazonaws.com/cni-metrics-helper:v1.12.6
  4. 请使用您的注册表、存储库和标签来标记提取的镜像。以下示例假设您从清单文件中提取镜像,然后将其推送到您在第一步中创建的 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
  5. 对注册表进行身份验证。在此示例中,您可以对在第一步中创建的 Amazon ECR 私有注册表进行身份验证。有关更多信息,请参阅 Amazon Elastic Container Registry 用户指南中的注册表身份验证

    aws ecr get-login-password --region region-code | docker login --username AWS --password-stdin 111122223333.dkr.ecr.region-code.amazonaws.com
  6. 将镜像推送到存储库。在此示例中,您将镜像推送到在第一步中创建的 Amazon ECR 私有存储库。有关更多信息,请参阅 Amazon Elastic Container Registry 用户指南中的推送 Docker 镜像

    docker push 111122223333.dkr.ecr.region-code.amazonaws.com/cni-metrics-helper:v1.12.6
  7. 请使用您推送的镜像 registry/repository:tag 来更新在上一步中用于确定镜像的清单文件。如果您使用 Helm 图表进行安装,通常可以选择指定 registry/repository:tag。安装图表时,请为您推送到存储库的镜像指定 registry/repository:tag