在代码库之间复制映像

您可以使用 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

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

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