在代码库之间复制映像

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

准备工作

验证以下要求:

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

  2. 您拥有所需的 权限

    • 您要从中复制的仓库的 Storage Object Viewer (roles/storage.objectViewer) 角色或具有同等权限的角色。

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

概览

gcrane 工具简化了跨 代码库的复制,并支持:

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

移除未使用的映像

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

设置 gcrane

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

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

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

我们建议您使用最新版本的 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 命令以验证安装内容。

您现在可以复制映像了。请按以下步骤继续操作:

设置本地机器

  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 -docker.pkg.dev/my-project/repo1/my-image:tag1 \
-docker.pkg.dev/my-project/repo2/my-image:tag1

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

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

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

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