在代码库之间复制映像

您可以使用 gcrane 工具在 Artifact Registry 中的 Docker 代码库之间复制映像。

您还可以使用该工具将映像从 Container Registry 复制到 Artifact Registry

准备工作

验证以下要求:

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

  2. 您拥有所需权限

    • Artifact Registry Reader (roles/storage.objectViewer) 或对要从中复制的代码库具有同等权限的角色。

    • Artifact Registry Writer (roles/artifactregistry.writer) 或具有目标代码库同等权限的角色。

概览

gcrane 工具支持以下功能,可简化跨代码库的复制操作:

  • 使用单个命令复制多组映像,包括指定路径下的所有映像或存储在项目的多区域主机上的所有映像。
  • 跳过已上传的映像层。

移除未使用的图片

在执行复制操作之前移除未使用的映像有助于降低存储费用。

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

如需详细了解如何设置和使用该工具,请参阅 gcr-cleaner 文档。

设置 gcrane

您可以从以下环境中运行 gcrane

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

    费用:Compute Engine 虚拟机的实例正常运行时间。如果虚拟机实例与源代码库不在同一位置,则您复制的映像可能会产生网络出站流量费用

  • Cloud Shell - 用于复制 40GB 或更小的小型数据集。 由于 gcrane 工具不会上传已上传的图片图层,因此此限制适用于您要复制的新数据。

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

    费用:如果 Cloud Shell 实例与源代码库不在同一位置,则您复制的映像可能会产生网络出站流量费用。您无法选择 Cloud Shell 会话的位置。如需检查当前会话所在的位置,请运行以下命令:

    curl metadata/computeMetadata/v1/instance/zone
    

我们建议您使用最新版本的 gcrane 工具,以充分利用所有可用的功能和增强功能。以下部分中的设置说明包含下载最新版本的步骤。

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

gcrane version

设置 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 工具后,您可以列出源代码库中的现有映像,以查找要复制的映像。

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

gcrane ls LOCATION-docker.pkg.dev/PROJECT/REPOSITORY

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

gcrane ls LOCATION-docker.pkg.dev/PROJECT/IMAGE

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

gcrane ls -r LOCATION-docker.pkg.dev/PROJECT/PATH

对于每个命令:

  • LOCATION 替换为代码库的位置
  • PROJECT 替换为项目 ID。
  • PATH 替换为要复制的路径。

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

复制映像

您可以使用 gcrane cp 命令复制单个映像或多组映像。

如需复制单个映像,请运行以下命令:

gcrane cp LOCATION1-docker.pkg.dev/PROJECT1/REPOSITORY1/IMAGE1 \
LOCATION2-docker.pkg.dev/PROJECT2/REPOSITORY2/IMAGE2

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

gcrane cp -r LOCATION1-docker.pkg.dev/PROJECT1/REPOSITORY1/IMAGE1/PATH1 \
LOCATION2-docker.pkg.dev/PROJECT2/REPOSITORY2/IMAGE2/PATH2

如需复制代码库中的所有映像,请运行以下命令:

gcrane cp -r LOCATION1-docker.pkg.dev/PROJECT1/REPOSITORY1 \
LOCATION2-docker.pkg.dev/PROJECT2/REPOSITORY2

替换以下值:

  • LOCATION1 是源代码库的位置
  • LOCATION2 是目标代码库的位置
  • PROJECT1 是与源代码库关联的 Google Cloud 项目 ID。
  • PROJECT2 是与目标代码库关联的 Google Cloud 项目 ID。
  • REPOSITORY1 是源代码库的名称。
  • REPOSITORY2 是目标代码库的名称。
  • IMAGE1 是您要复制的映像。
  • IMAGE2 是目标代码库中该映像的名称。

示例

以下命令将 my-image:tag1 从代码库 repo1 复制到同一项目和区域内的代码库 repo2

gcrane cp us-west1-docker.pkg.dev/my-project/repo1/my-image:tag1 \
us-west1-docker.pkg.dev/my-project/repo2/my-image:tag1

以下命令以递归方式将代码库 repo1test-images/testing 下的所有映像复制到代码库 repo2 下的相同路径。

gcrane cp -r us-west1-docker.pkg.dev/my-project/repo1/test-images/testing \
us-west1-docker.pkg.dev/my-project/repo2/test-images/testing

以下命令将项目 dev-project 中的代码库 my-repo 中的所有映像复制到另一个名为 prod-project 的项目中的代码库 my-repo

gcrane cp -r us-west1-docker.pkg.dev/dev-project/my-repo \
us-west1-docker.pkg.dev/prod-project/my-repo