从 Container Registry 中复制映像

在从 Container Registry 过渡到 Artifact Registry 的过程中,您可以复制要保留在 Artifact Registry 中的 Container Registry 映像。

概览

您可以通过多种方式将映像从 Container Registry 复制到 Artifact Registry我们建议您复制图片 自动迁移工具,因为它可以 支持复制多个项目,即使您已经 且只能处理比其他网站更多的图片 方法。图片数量未达到 10,000 且尚未启用 可以使用 gcrane 工具 它还支持使用单个命令复制多组映像。

如需降低费用,请执行以下操作:

  1. 移除未进行标记的旧映像,然后再将容器复制到 Artifact Registry

  2. 如果您要将映像复制到标准 (pkg.dev) Artifact Registry 代码库 停用自动扫描 然后再复制映像,以防出现重复 扫描费用。您可以在复制完所有副本后重新启用自动扫描功能 图片。

    将映像复制到 Artifact Registry 上的 gcr.io 代码库 则无需停用自动扫描。

    如需详细了解如何控制与漏洞扫描相关的费用, 请参阅 控制漏洞扫描费用

从 Container Registry 中移除未标记的映像

移除未标记的映像有助于降低在 Container Registry 中的存储费用,以及将映像从 Container Registry 复制到 Artifact Registry 的费用。

您可以通过许多工具来识别并自动移除不再需要的映像。例如, gcr-cleaner 工具可帮助您根据不同的条件查找并移除旧图片。 gcr-cleaner 工具不是 Google 官方产品。

有关设置和使用该工具的详情,请参阅 gcr-cleaner 文档。

使用自动迁移工具复制映像(推荐)

使用自动迁移工具从 Container Registry 迁移到 Artifact Registry 上的 gcr.io 仓库或标准 Artifact Registry 中的 gcr.io 代码库 代码库,或者将映像从 Container Registry 复制到 Artifact Registry。

此工具仅支持迁移和复制到同一多区域。

请按照 自动迁移到 Artifact Registry 以进行复制 将映像从 Container Registry 迁移到 Artifact Registry

使用 gcrane 复制映像

如需将映像复制到 Artifact Registry,您还可以使用 gcrane 工具。

gcrane 允许在多个区域之间复制图片,但具有以下特征 缺点:

  • gcrane 比自动化工具速度慢。
  • gcrane 受 Container Registry 配额的限制。
  • 如果任何映像包含的版本或标记超过 10,000 个,则 gcrane 可能会失败。
  • 如果任何映像配置有误或缺少数据,则 gcrane 可能会失败。

使用要求

验证以下要求:

  1. 您在源代码中启用了 Artifact Registry,并且 目标 Google Cloud 项目。

  2. 您已在以下位置创建 Docker 代码库: Artifact Registry。

  3. 您拥有所需的权限:

    • Storage Object Viewer (roles/storage.objectViewer) 或具有 对存储桶的等效权限 Container Registry 主机 了解如何授予这些权限

    • Artifact Registry Writer (roles/artifactregistry.writer) 或角色 以及对 Artifact Registry 的等效权限 存储库了解如何授予这些权限

  4. 如需使用快速复制选项,请验证以下要求:

    • 您必须使用 gcrane 0.10.0 或更高版本。 本文档中的 gcrane 设置说明包括 下载最新版本。

      如需检查现有 gcrane 安装的版本,请运行以下命令:

      gcrane version
      
    • 目标项目的 Artifact Registry Service Agent 必须具有 Storage Object Viewer (roles/storage.objectViewer) 角色或 具有源项目中具有同等权限的角色。运行以下命令 向服务代理授予 Storage Object Viewer 角色:

      gcloud projects add-iam-policy-binding SOURCE_PROJECT_ID \
          --member='serviceAccount:service-DEST_PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com' \
          --role='roles/storage.objectViewer'
      

      SOURCE_PROJECT_ID 替换为 Google Cloud 的 ID(例如:“my-project”) 使用 Container Registry 主机

      DEST_PROJECT_NUMBER 替换为具有 Artifact Registry 代码库的 Google Cloud 项目的编号(例如:12345)。

环境选项和费用

您可以在多个环境中运行 gcrane

  • Compute Engine 实例 - 如果要复制大量容器,请使用此选项。

    费用

    • 实例正常运行时间: Compute Engine 虚拟机
    • 网络数据传输,适用于您复制的图片(除非您使用的是 快速复制选项。为了最大限度地降低费用:
    • 使用与 Container Registry 位于同一位置的虚拟机实例 存储桶。
    • 为了最大限度地降低费用并提高复制速度,请使用 Artifact Registry 与 Container Registry 位于同一多区域位置数据传输 同一多区域位置内不会产生费用,并且速度更快 而不是跨位置复制。
  • Cloud Shell - 用于复制 40GB 或更小的小型数据集。 由于 gcrane 不会上传已经上传的图片图层,因此这 上限适用于您要复制的新数据。

    复制较大的代码库可能会导致 Cloud Shell 在经过请求超时时间(10 分钟)后断开连接。

    费用:针对您复制的映像的网络数据传输,除非您 使用快速复制选项

    • 您无法选择 Cloud Shell 会话的位置。如需检查当前会话所在的位置,请运行以下命令:
    curl metadata/computeMetadata/v1/instance/zone
    
    • 为了最大限度地降低费用并提高复制速度,请使用 Artifact Registry 与 Container Registry 位于同一多区域位置数据传输 同一多区域位置内不会产生费用,并且速度更快 而不是跨位置复制。
  • 本地机器 - 如果您无法使用其他选项,则可以从本地机器运行 gcrane

    费用:针对您复制的映像的网络数据传输,除非您 使用快速复制选项

    为了最大限度地降低费用并提高复制速度,请使用 Artifact Registry 与 Container Registry 位于同一多区域位置数据传输范围: 同一个多区域不会产生费用,而且比复制要快得多 。

设置 Compute Engine

如需从 Compute Engine 虚拟机实例复制具有 gcrane 的映像,请执行以下操作:

  1. 创建虚拟机实例。 为了最大限度地降低费用,请在 您要从中复制数据的注册表。
  2. 默认情况下,虚拟机实例与默认服务账号相关联,并且有权拉取映像。您必须更改访问权限范围, 虚拟机实例可以推送映像

    1. 停止虚拟机实例。请参阅停止实例

    2. 使用以下命令更改访问权限范围:

      gcloud compute instances set-service-account INSTANCE --scopes=storage-rw
      

      INSTANCE 替换为虚拟机实例的名称。

    3. 重启虚拟机实例。请参阅启动已停止的实例

  3. 使用 SSH 连接到虚拟机实例。

  4. 运行以下命令来下载 gcrane

    curl -L \
    https://github.com/google/go-containerregistry/releases/latest/download/go-containerregistry_Linux_x86_64.tar.gz \
    -o go-containerregistry.tar.gz
    
  5. 运行以下命令以让 gcrane 命令可执行。

    tar -zxvf go-containerregistry.tar.gz
    chmod +x gcrane
    sudo mv gcrane /usr/local/bin/
    
  6. 运行 gcrane --help 命令以验证安装内容。

您现在可以复制映像了。请按以下步骤继续操作:

设置 Cloud Shell

  1. 打开一个 Cloud Shell 窗口。

    打开 Cloud Shell

  2. 设置默认项目。将 PROJECT 替换为安装了 Container Registry 和 Artifact Registry 的项目的 ID

    gcloud config set project PROJECT
    
  3. 运行以下命令以下载 gcrane 工具。

    curl -L \
    https://github.com/google/go-containerregistry/releases/latest/download/go-containerregistry_Linux_x86_64.tar.gz \
    -o go-containerregistry.tar.gz
    
  4. 运行以下命令以让 gcrane 命令可执行。

    tar -zxvf go-containerregistry.tar.gz
    chmod +x gcrane
    sudo mv gcrane /usr/local/bin/
    
  5. 运行 gcrane --help 命令以验证安装内容。

您现在可以复制映像了。请按以下步骤继续操作:

设置本地机器

  1. GitHub 代码库下载 gcrane。 例如,使用以下命令可下载 Linux x86-64 发行版 。

    curl -L \
    https://github.com/google/go-containerregistry/releases/latest/download/go-containerregistry_Linux_x86_64.tar.gz \
    -o go-containerregistry.tar.gz
    
  2. 运行以下命令以让 gcrane 命令可执行。这些命令假设下载的文件名为 go-containerregistry.tar.gz

    tar -zxvf go-containerregistry.tar.gz
    chmod +x gcrane
    sudo mv gcrane /usr/local/bin/
    
  3. 运行 gcrane --help 命令以验证安装内容。

您现在可以复制映像了。请按以下步骤继续操作:

识别要复制的映像

安装 gcrane 后,您可以列出 Container Registry 中的现有映像以查找您要复制的映像。

如需列出现有映像,请运行以下命令:

gcrane ls LOCATION.gcr.io/PROJECT

如需列出映像具有的标记,请运行以下命令:

gcrane ls LOCATION.gcr.io/PROJECT/IMAGE

如需以递归方式列出特定路径下的映像,请运行以下命令:

gcrane ls -r LOCATION.gcr.io/PROJECT/PATH

对于每个命令:

  • LOCATION 替换为注册表的多区域:asiaeuus
  • PROJECT 替换为项目 ID。

如需查看用于复制映像的命令,请参阅复制映像

复制映像

您可以复制 Container Registry 中的单个映像、某个位置指定路径下的所有映像或存储在某个位置的所有映像。

复制单个映像

要复制已标记的单个映像,请运行以下命令:

gcrane cp GCR-LOCATION.gcr.io/PROJECT/IMAGE \
AR-LOCATION.pkg.dev/PROJECT/REPOSITORY/IMAGE

其中

  • GCR-LOCATION 是 Container Registry 主机的多区域:asiaeuus
  • AR-LOCATION 是代码库的单区域或多区域
  • PROJECT 是项目 ID。
  • REPOSITORY 是 Artifact Registry 代码库的名称。
  • GCR-IMAGE 是您要从中复制数据的映像 Container Registry
  • AR-IMAGE 是 Artifact Registry 中的映像名称。

例如,请考虑以下来源和目标映像:

  • Container Registry 映像:eu.gcr.io/my-project/my-image:tag1
  • Artifact Registry 映像:europe-docker.pkg.dev/my-project/my-repo/my-image:tag1

运行以下命令以复制映像:

gcrane cp eu.gcr.io/my-project/my-image:tag1 \
europe-docker.pkg.dev/my-project/my-repo/my-image:tag1

复制路径下的所有映像

如需以递归方式复制 Container Registry 中特定路径下的映像,请运行以下命令:

gcrane cp -r GCR-LOCATION.gcr.io/PROJECT/GCR-PATH \
AR-LOCATION.pkg.dev/PROJECT/REPOSITORY/AR-PATH

其中

  • GCR-LOCATION 是 Container Registry 主机的多区域:asiaeuus
  • AR-LOCATION 是代码库的单区域或多区域
  • PROJECT 是项目 ID。
  • REPOSITORY 是 Artifact Registry 代码库的名称。
  • GCR-PATH 是您要复制的文件的路径。
  • AR-PATH 是 Artifact Registry 代码库中映像的路径。

例如,请考虑以下来源和目标路径:

  • Container Registry 路径:eu.gcr.io/my-project/test-images/testing
  • Artifact Registry 路径:europe-docker.pkg.dev/my-project/my-repo/test-images/testing

以下命令会以递归方式将 test-images/testing 下的所有映像复制到 my-repo 代码库中:

gcrane cp -r eu.gcr.io/my-project/test-images/testing \
europe-docker.pkg.dev/my-project/my-repo/test-images/testing

复制 Container Registry 位置中的所有映像

如需从 Container Registry 多区域位置复制所有映像,请运行以下命令:

gcrane cp -r GCR-LOCATION.gcr.io/PROJECT \
AR-LOCATION.pkg.dev/PROJECT/REPOSITORY

其中

  • GCR-LOCATION 是 Container Registry 主机的多区域:asiaeuus
  • AR-LOCATION 是代码库的单区域或多区域
  • PROJECT 是项目 ID。
  • REPOSITORY 是 Artifact Registry 代码库的名称。

如果要复制您项目中多个 Container Registry 位置的映像,请为每个主机运行一次该命令。

例如,请考虑以下来源注册表和目标 Artifact Registry 代码库。在此示例中,Container Registry 和 Artifact Registry 位于不同的项目中。

  • Container Registry 主机:eu.gcr.io/my-project
  • Artifact Registry 映像:europe-docker.pkg.dev/new-project/my-repo

以下命令会将项目 my-projecteu 多区域的所有映像都复制到项目 new-project 中的 my-repo 代码库。

gcrane cp -r eu.gcr.io/my-project \
europe-docker.pkg.dev/new-project/my-repo

使用 Docker 复制映像

gcranegcloud 复制方法不同,此方法包含两个步骤。

  1. 从 Container Registry 中拉取映像
  2. 将该映像推送到 Artifact Registry 代码库。

使用要求

验证以下要求:

  1. 您已在以下位置创建 Docker 代码库: Artifact Registry。

  2. 您拥有所需的权限:

    • Storage Object Viewer (roles/storage.objectViewer) 或具有 对存储桶的等效权限 Container Registry 主机 了解如何授予这些权限

    • Artifact Registry Writer (roles/artifactregistry.writer) 或角色 以及对 Artifact Registry 的等效权限 存储库了解如何授予这些权限

  3. 您已将 Docker 配置为向 Container RegistryArtifact Registry

费用

拉取映像时,您需要为网络数据传输付费。 具体价格取决于拉取命令的目的地。例如,如果您从 Cloud Shell 会话中拉取映像, 适用于 Google Cloud 内的网络数据传输。 如果将映像拉取到 Google Cloud 之外的机器 一般网络数据传输的价格。

您在 Artifact Registry 中用于标记、推送和拉取映像的 Docker 命令类似于您在 Container Registry 中使用的命令。主要有两个区别:

  • Artifact Registry Docker 代码库的主机名包含位置前缀,后跟 -docker.pkg.dev。例如 australia-southeast1-docker.pkg.deveurope-north1-docker.pkg.deveurope-docker.pkg.dev
  • 由于 Artifact Registry 在单个位置支持多个 Docker 仓库 项目中,必须在命令中指定代码库名称。

如需使用 Docker 将映像复制到 Artifact Registry 中,请从 Container Registry 中拉取映像,然后将其推送到 Artifact Registry 代码库。

例如,考虑一个位于 eu 多区域位置的 Container Registry 映像 并且想要将其复制到 europe 区域。

  • Container Registry 映像:eu.gcr.io/my-project/my-image:tag1
  • Artifact Registry 映像:europe-docker.pkg.dev/my-project/my-repo/my-image:tag1

通过以下命令从 Container Registry 中拉取映像。

docker pull eu.gcr.io/my-project/my-image:tag1

通过以下命令将映像推送到名为 my-repo 的 Artifact Registry 代码库。

docker push europe-north1-docker.pkg.dev/my-project/my-repo/my-image

您还可以将映像推送到您在其他项目中设置的 Artifact Registry 代码库。本示例将同一来源映像推送到项目 new-project 中的代码库 my-repo

docker push europe-north1-docker.pkg.dev/new-project/my-repo/my-image

如需详细了解如何在 Artifact Registry 中推送和拉取映像,请参阅推送和拉取映像

使用 gcloud 复制映像

使用 gcloud container images add-tag 命令将 Container Registry 中的映像复制到 Artifact Registry 代码库。

使用要求

验证以下要求:

  1. 您已在以下位置创建 Docker 代码库: Artifact Registry。

  2. 您拥有所需的权限:

    • Storage Object Viewer (roles/storage.objectViewer) 或具有 对存储桶的等效权限 Container Registry 主机 了解如何授予这些权限

    • Artifact Registry Writer (roles/artifactregistry.writer) 或角色 以及对 Artifact Registry 的等效权限 存储库了解如何授予这些权限

费用

如果 Container Registry 与 Artifact Registry 代码库 网络数据传输费用 适用于您复制的图片。如果这两项服务位于同一位置 但数据转移服务是免费的

运行以下命令将映像从 Container Registry 复制到 Artifact Registry:

gcloud container images add-tag GCR-IMAGE AR-IMAGE

其中

  • GCR-IMAGE 是 Container Registry 映像的完整路径。
  • AR-IMAGE 是 Artifact Registry 代码库中的映像的完整路径。

例如,请考虑以下来源和目标映像:

  • Container Registry 映像:eu.gcr.io/my-project/my-image:tag1
  • Artifact Registry 映像:europe-docker.pkg.dev/my-project/my-repo/my-image:tag1

此命令会将映像从 Container Registry 多区域 eu 复制到多区域 europe 中的代码库 my-repo

gcloud container images add-tag eu.gcr.io/my-project/my-image:tag1 \
europe-docker.pkg.dev/my-project/my-repo/my-image:tag1

您还可以将映像复制到您在其他项目中设置的 Artifact Registry 代码库。本示例将同一来源映像复制到项目 new-project 中的代码库 my-repo

gcloud container images add-tag eu.gcr.io/my-project/my-image:tag1 \
europe-docker.pkg.dev/new-project/my-repo/my-image:tag1

后续步骤