从 Container Registry 复制映像

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

概览

您可以通过多种方式将映像从 Container Registry 复制到 Artifact Registry。我们建议您使用自动迁移工具复制映像,因为它支持复制多个项目,即使您已启用重定向,也可以复制映像,并且可以处理比其他方法更多的图片。如果您的映像数量不超过 1 万个,并且尚未启用重定向,则可以使用 gcrane 工具,该工具还支持使用单个命令复制多组映像。

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

  1. 在将容器复制到 Artifact Registry 之前,请先移除未标记的旧映像。

  2. 如需将映像复制到标准 (pkg.dev) Artifact Registry 代码库,请在复制映像之前对 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 代码库,或者将映像从 Container Registry 复制到 Artifact Registry。

按照自动迁移到 Artifact Registry 中的说明,将映像从 Container Registry 复制到 Artifact Registry。

使用 gcrane 复制映像

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

与使用 Docker 复制映像相比,gcrane 具有多项优势,包括:

  • 使用单个命令复制映像集,包括指定路径下的所有映像或存储在项目中多区域主机上的所有映像。
  • 跳过已上传的映像层。
  • 在同一 Google Cloud 多区域中的 Container Registry 和 Artifact Registry 之间复制映像时的快速复制选项。

    快速复制选项也是成本最低的复制方法。由于此选项不依赖于拉取和推送映像,因此在复制操作期间从 Container Registry 传输网络数据不会产生任何费用。

使用要求

请验证以下要求:

  1. 您在源 Google Cloud 项目和目标 Google Cloud 项目中已启用 Artifact Registry

  2. 您已在 Artifact Registry 中为要复制的映像创建 Docker 代码库

  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 Google 代管式服务帐号必须具有 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 替换为 Container Registry 主机所属的 Google Cloud 项目的 ID(例如:“my-project”)。

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

环境选项和费用

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

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

    费用

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

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

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

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

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

    为了最大限度地降低费用并提高复制速度,请使用 Container Registry 所在多区域中的 Artifact 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. 您已在 Artifact Registry 中为要复制的映像创建 Docker 代码库

  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 区域中的 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 中拉取映像。

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. 您已在 Artifact Registry 中为要复制的映像创建 Docker 代码库

  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

此命令会将映像从多区域 eu 中的 Container Registry 复制到多区域 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

后续步骤