在从 Container Registry 过渡到 Artifact Registry 的过程中,您可以复制要保留在 Artifact Registry 中的 Container Registry 映像。
概览
您可以通过多种方式将映像从 Container Registry 复制到 Artifact Registry我们建议您复制图片 自动迁移工具,因为它可以 支持复制多个项目,即使您已经 且只能处理比其他网站更多的图片 方法。
如需降低费用,请执行以下操作:
先移除未进行标记的旧映像,然后再将容器复制到 Artifact Registry
如果您要将映像复制到标准 (
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 迁移到
gcr.io
个代码库(位于 Artifact Registry 或标准 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 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 实例 - 如果要复制大量容器,请使用此选项。
费用:
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
的映像,请执行以下操作:
- 创建虚拟机实例。 为了最大限度地降低费用,请在 您要从中复制数据的注册表。
默认情况下,虚拟机实例与默认服务账号相关联,并且有权拉取映像。您必须更改访问权限范围, 虚拟机实例可以推送映像
使用 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
此命令会将映像从 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
后续步骤
- 详细了解如何从 Container Registry 转换 到 Artifact Registry,包括功能和 gcloud CLI 命令 比较。
- 了解 Docker 相关变更。
- 了解有关在 Google Cloud 中构建和部署应用的更改。