在代码库之间复制映像

您可以使用 gcrane 工具在以下位置的 Docker 代码库之间复制映像: Artifact Registry

您还可以使用该工具 从 Container Registry 迁移到 Artifact Registry

准备工作

验证以下要求:

  1. 您已在以下位置创建了目标 Docker 代码库: Artifact Registry。

  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 实例 - 如果要复制大量容器,请使用此选项。

    费用:<ph type="x-smartling-placeholder"></ph>实例正常运行时间 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 是与 源代码库
  • PROJECT2 是与 目标代码库
  • REPOSITORY1 是源代码库的名称。
  • REPOSITORY2 是目标代码库的名称。
  • IMAGE1 是您要复制的映像。
  • IMAGE2 是目标代码库中该映像的名称。

示例

以下命令会从代码库 repo1 中复制 my-image:tag1 同一项目和区域内的代码库 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

以下命令以递归方式复制 test-images/testing 下的所有映像 repo1 与代码库下的相同路径 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