在从 Container Registry 过渡到 Artifact Registry 的过程中,您可以复制要保留在 Artifact Registry 中的 Container Registry 映像。
概览
您可以通过多种方式将映像从 Container Registry 复制到 Artifact Registry。我们建议您使用自动迁移工具复制图片,因为该工具支持复制多个项目,即使您已启用重定向,也能复制图片,并且与其他方法相比,可以处理更多图片。
如需降低费用,请执行以下操作:
在将容器复制到 Artifact Registry 之前,请先移除未标记的旧映像。
如果您要将映像复制到标准 (
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
工具。
gcrane
允许在多个区域之间复制映像,但存在以下缺点:
gcrane
的速度比自动化工具慢。gcrane
受 Container Registry 配额限制。- 如果任何图片的版本或标记超过 10,000 个,
gcrane
可能会失败。 - 如果任何图片配置错误或缺少数据,
gcrane
都可能会失败。
要求
请验证您是否满足以下要求:
您已在源 Google Cloud 项目和目标 Google Cloud 项目中启用 Artifact Registry。
您已在 Artifact Registry 中为要复制的映像创建了 Docker 代码库。
您拥有所需的权限:
Storage Object Viewer (
roles/storage.objectViewer
) 或对 Container Registry 主机的存储分区具有等效权限的角色。了解如何授予这些权限。Artifact Registry Writer (
roles/artifactregistry.writer
) 或对 Artifact Registry 代码库具有等效权限的角色。了解如何授予这些权限。
如需使用快速复制选项,请验证是否满足以下要求:
您必须使用 gcrane 0.10.0 或更高版本。本文档中的 gcrane 设置说明包含下载最新版本的步骤。
如需检查现有 gcrane 安装版本,请运行以下命令:
gcrane version
目标项目的 Artifact Registry 服务代理必须在来源项目中具有 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 主机的项目的 ID(例如“my-project”)。 Google Cloud将
DEST_PROJECT_NUMBER
替换为包含 Artifact Registry 制品库的 Google Cloud 项目的编号(例如 12345)。
环境选项和费用
您可以在多个环境中运行 gcrane
:
Compute Engine 实例 - 如果要复制大量容器,请使用此选项。
费用:
Cloud Shell - 用于复制一小组映像(大约 40GB 或更少)的选项。 由于
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
的映像,请执行以下操作:
- 创建虚拟机实例。若要最大限度地降低费用,请在要从中复制的代码库所在的位置创建该实例。
默认情况下,虚拟机实例与默认服务账号相关联,并且有权拉取映像。您必须更改访问权限范围,以便虚拟机实例能够推送映像。
使用 SSH 连接到虚拟机实例。
运行以下命令来下载
gcrane
。curl -L \ https://github.com/google/go-containerregistry/releases/latest/download/go-containerregistry_Linux_x86_64.tar.gz \ -o go-containerregistry.tar.gz
运行以下命令以让
gcrane
命令可执行。tar -zxvf go-containerregistry.tar.gz chmod +x gcrane sudo mv gcrane /usr/local/bin/
运行
gcrane --help
命令以验证安装内容。
您现在可以复制映像了。请按以下步骤继续操作:
设置 Cloud Shell
打开一个 Cloud Shell 窗口。
设置默认项目。将 PROJECT 替换为安装了 Container Registry 和 Artifact Registry 的项目的 ID
gcloud config set project PROJECT
运行以下命令以下载
gcrane
工具。curl -L \ https://github.com/google/go-containerregistry/releases/latest/download/go-containerregistry_Linux_x86_64.tar.gz \ -o go-containerregistry.tar.gz
运行以下命令以让
gcrane
命令可执行。tar -zxvf go-containerregistry.tar.gz chmod +x gcrane sudo mv gcrane /usr/local/bin/
运行
gcrane --help
命令以验证安装内容。
您现在可以复制映像了。请按以下步骤继续操作:
设置本地机器
从 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
运行以下命令以让
gcrane
命令可执行。这些命令假设下载的文件名为go-containerregistry.tar.gz
。tar -zxvf go-containerregistry.tar.gz chmod +x gcrane sudo mv gcrane /usr/local/bin/
运行
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
替换为注册表的多区域:asia
、eu
或us
。 - 将
PROJECT
替换为项目 ID。
如需查看用于复制映像的命令,请参阅复制映像。
复制映像
您可以复制 Container Registry 中的单个映像、某个位置指定路径下的所有映像或存储在某个位置的所有映像。
复制单个映像
要复制已标记的单个映像,请运行以下命令:
gcrane cp GCR-LOCATION.gcr.io/PROJECT/IMAGE \
AR-LOCATION.pkg.dev/PROJECT/REPOSITORY/IMAGE
其中
- GCR-LOCATION 是 Container Registry 主机的多区域:
asia
、eu
或us
。 - 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 主机的多区域:
asia
、eu
或us
。 - 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 主机的多区域:
asia
、eu
或us
。 - 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-project
中 eu
多区域的所有映像都复制到项目 new-project
中的 my-repo
代码库。
gcrane cp -r eu.gcr.io/my-project \
europe-docker.pkg.dev/new-project/my-repo
使用 Docker 复制映像
与 gcrane 和 gcloud 复制方法不同,此方法包含两个步骤。
- 从 Container Registry 中拉取映像
- 将该映像推送到 Artifact Registry 代码库。
要求
请验证您是否满足以下要求:
您已在 Artifact Registry 中为要复制的映像创建了 Docker 代码库。
您拥有所需的权限:
Storage Object Viewer (
roles/storage.objectViewer
) 或对 Container Registry 主机的存储分区具有等效权限的角色。了解如何授予这些权限。Artifact Registry Writer (
roles/artifactregistry.writer
) 或对 Artifact Registry 代码库具有等效权限的角色。了解如何授予这些权限。
您已将 Docker 配置为同时向 Container Registry 和 Artifact Registry 进行身份验证。
费用
拉取映像时,您需要为网络数据传输付费。具体价格取决于拉取命令的目的地。例如,如果您是从 Cloud Shell 会话拉取映像,则价格适用于 Google Cloud内的网络数据传输。如果是将映像拉取到 Google Cloud外部的机器,则价格适用于常规网络数据传输。
您在 Artifact Registry 中用于标记、推送和拉取映像的 Docker 命令类似于您在 Container Registry 中使用的命令。主要有两个区别:
- Artifact Registry Docker 代码库的主机名包含位置前缀,后跟
-docker.pkg.dev
。例如australia-southeast1-docker.pkg.dev
、europe-north1-docker.pkg.dev
和europe-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 代码库。
要求
请验证您是否满足以下要求:
您已在 Artifact Registry 中为要复制的映像创建了 Docker 代码库。
您拥有所需的权限:
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
后续步骤
- 详细了解如何从 Container Registry 迁移到 Artifact Registry,包括功能和 gcloud CLI 命令对比。
- 了解有关 Docker 的更改。
- 了解有关在 Google Cloud中构建和部署应用的更改。