リポジトリ間でのイメージのコピー

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. gcraneGitHub リポジトリからダウンロードします。たとえば、次のコマンドは、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-east1-docker.pkg.dev/my-project/repo1/my-image:tag1 \
us-east1-docker.pkg.dev/my-project/repo2/my-image:tag1

次のコマンドは、リポジトリ repo1 内の test-images/testing の下にあるすべてのイメージを、リポジトリ repo2 の下の同じパスに再帰的にコピーします。

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

次のコマンドは、すべてのイメージをプロジェクト dev-project のリポジトリ my-repo から prod-project という別のプロジェクトのリポジトリ my-repo にコピーします。

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