リポジトリ間でイメージをコピーする

gcrane ツールを使用して、Artifact Registry の Docker リポジトリ間でイメージをコピーできます。

このツールを使用して、Container Registry から Artifact Registry にイメージをコピーすることもできます。

始める前に

次の要件を確認します。

  1. コピーするイメージ用の Artifact Registry でターゲットの Docker リポジトリを作成済みである。

  2. 次の必要な権限が付与されている。

    • コピー元のリポジトリに対して Artifact Registry 読み取り(roles/storage.objectViewer)または同等の権限を持つロール。

    • ターゲット リポジトリに対して Artifact Registry 書き込み(roles/artifactregistry.writer)、または同等の権限を持つロール。

概要

gcrane ツールを使用すると、次の機能により、リポジトリ間のコピーが簡単になります。

  • 特定のパスの下にあるすべてのイメージ、プロジェクトのマルチリージョン ホストに保存されているすべてのイメージを含め、1 つのコマンドでイメージのセットをコピーできます。
  • すでにアップロードされている画像レイヤをスキップできます。

未使用イメージの削除

コピー操作を実行する前に未使用のイメージを削除すると、ストレージ費用を削減できます。

多数のツールで、もう必要ではなくなったイメージを特定して自動的に削除できます。たとえば、gcr-cleaner ツールを使用すると、さまざまな基準に基づいて古いイメージを見つけて削除できます。gcr-cleaner ツールは Google の公式プロダクトではありません。

このツールの設定と使用方法の詳細については、gcr-cleaner のドキュメントをご覧ください。

gcrane の設定

gcrane は次の環境から実行できます。

  • Compute Engine インスタンス - コピーするコンテナの数が多い場合は、このオプションを使用します。

    コスト: Compute Engine VM のインスタンス稼働時間。VM インスタンスがソース リポジトリとは異なる場所にある場合、コピーしたイメージには下り(外向き)のネットワーク料金が適用されることがあります。

  • Cloud Shell - 約 40 GB 以下の小さなセットのコピーのためのオプション。 gcrane は、すでにアップロードされているイメージレイヤのアップロードをスキップするため、この制限はコピーする新しいデータに対するものです。

    規模の大きなリポジトリをコピーする場合は、10 分間のリクエスト タイムアウト期間が経過すると、Cloud Shell の接続が解除される可能性があります。

    コスト: Cloud Shell インスタンスがソース リポジトリとは異なる場所にある場合、コピーしたイメージには下り(外向き)のネットワーク料金が適用されることがあります。Cloud Shell セッションのロケーションは選択できません。現在のセッションの場所を確認するには、次のコマンドを実行します。

    curl metadata/computeMetadata/v1/instance/zone
    

利用可能なすべての機能と機能強化を活用するには、gcrane ツールの最新バージョンを使用することをおすすめします。次のセクションの設定手順には、最新バージョンをダウンロードする手順が含まれます。

インストールされている gcrane のバージョンを確認するには、次のコマンドを実行します。

gcrane version

Compute Engine の設定

Compute Engine VM インスタンスから gcrane を使用してイメージをコピーするには:

  1. VM インスタンスを作成します。費用を最小にするには、コピー元のレジストリと同じロケーションにインスタンスを作成します。
  2. デフォルトでは、VM インスタンスはデフォルトのサービス アカウントに関連付けられており、イメージを pull する権限があります。VM インスタンスがイメージを push できるように、アクセス スコープを変更する必要があります。

    1. VM インスタンスを停止します。インスタンスの停止をご覧ください。

    2. 次のコマンドでアクセス スコープを変更します。

      gcloud compute instances set-service-account INSTANCE --scopes=storage-rw
      

      INSTANCE は VM インスタンスの名前に置き換えます。

    3. VM インスタンスを再起動します。停止されたインスタンスの起動をご覧ください。

  3. SSH を使用して VM インスタンスに接続します。

  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 コマンドを使用して、個々のイメージやイメージセットをコピーできます。

1 つのイメージをコピーするには、次のコマンドを実行します。

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