Container Registry からのイメージをコピーする

Container Registry から Artifact Registry への移行の一環として、Artifact Registry に保持したい Container Registry イメージをコピーできます。

概要

Container Registry から Artifact Registry にイメージをコピーするための選択肢はいくつかあります。自動移行ツールでイメージをコピーすることをおすすめします。このツールは、複数のプロジェクトのコピーをサポートし、すでにリダイレクトが有効になっていてもイメージをコピーでき、他の方法より多くのデータを処理できるためです。イメージが 10,000 個以下で、リダイレクトをまだ有効にしていない場合は、gcrane ツールを使用できます。このツールは、1 つのコマンドでイメージのセットをコピーできます。

コストを削減するには、次のことを行います。

  1. コンテナを Artifact Registry にコピーする前に、タグのない古いイメージを削除します。

  2. イメージを標準(pkg.dev)Artifact Registry リポジトリにコピーする場合は、イメージをコピーする前に Artifact Registry の自動スキャンを無効にして、重複を防止します。すべてのイメージをコピーしたら、自動スキャンを再度有効にすることができます。

    Artifact Registry の gcr.io リポジトリにイメージをコピーする場合は、自動スキャンを無効にする必要はありません。

    脆弱性スキャンに関連する費用の管理について詳しくは、脆弱性スキャンの費用の管理をご覧ください。

タグ付けされていないイメージを Container Registry から削除する

タグ付けされていないイメージを削除すると、Container Registry のストレージ費用と、Container Registry から Artifact Registry にイメージをコピーする際の費用を削減できます。

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

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

自動移行ツールでイメージをコピーする(推奨)

自動移行ツールを使用して、Container Registry から Artifact Registry の gcr.io リポジトリまたは標準 Artifact Registry リポジトリに移行するか、イメージを Container Registry から Artifact Registry にコピーします。

このツールは、同じマルチリージョンへの移行とコピーのみをサポートしています。

Artifact Registry に自動的に移行するの手順に沿って、Container Registry から Artifact Registry にイメージをコピーします。

gcrane を使用したイメージのコピー

Artifact Registry にイメージをコピーする場合は、gcrane ツールも使用できます。

gcrane を使用すると、複数のリージョン間でイメージをコピーできますが、次のようなデメリットがあります。

  • gcrane は自動ツールよりも時間がかかります。
  • gcrane は Container Registry の割り当てによって制限されます。
  • イメージのバージョンやタグが 10,000 を超えると、gcrane が失敗することがあります。
  • イメージの構成に誤りがあるかデータが欠落している場合、gcrane が失敗する可能性があります。

要件

次の要件を確認します。

  1. 送信元と宛先の Google Cloud プロジェクトで Artifact Registry が有効になっている。

  2. コピーするイメージ用の Docker リポジトリが Artifact Registry で作成済みである。

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

    • ストレージ オブジェクト閲覧者(roles/storage.objectViewer)、または Container Registry ホストのストレージ バケットに対する同等の権限を持つロール。これらの権限の付与について学習します。

    • Artifact Registry 書き込み(roles/artifactregistry.writer)、または Artifact Registry リポジトリに対する同等の権限を持つロール。これらの権限の付与について学習します。

  4. 高速コピー オプションを使用するには、次の要件を確認します。

    • gcrane バージョン 0.10.0 以降を使用する必要がある。このドキュメントの gcrane の設定手順には、最新バージョンをダウンロードする手順が記載されています。

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

      gcrane version
      
    • 宛先プロジェクトの Artifact Registry サービス エージェントには、Storage オブジェクト閲覧者(roles/storage.objectViewer)ロール、またはソース プロジェクトにおいて同等の権限を持つロールが必要です。次のコマンドを実行して、サービス エージェントに Storage オブジェクト閲覧者のロールを付与します。

      gcloud projects add-iam-policy-binding SOURCE_PROJECT_ID \
          --member='serviceAccount:service-DEST_PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com' \
          --role='roles/storage.objectViewer'
      

      SOURCE_PROJECT_ID は、Container Registry ホストを使用する Google Cloud プロジェクトの ID(例:「my-project」)に置き換えます。

      DEST_PROJECT_NUMBER は、Artifact Registry リポジトリを使用する Google Cloud プロジェクトの番号(例: 12345)に置き換えます。

環境のオプションと費用

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

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

    費用

    • Compute Engine VM のインスタンス稼働時間
    • コピーするイメージのネットワーク データ転送高速コピーオプションを使用している場合を除く)。費用を最小限にするには:
    • Container Registry ストレージ バケットと同じロケーションで VM インスタンスを使用してください。
    • 費用を最小にして、コピー速度を最大にするには、Container Registry と同じマルチリージョン内の Artifact Registry リポジトリを使用します。同じマルチリージョン内のデータ転送は課金されず、ロケーション間でコピーするよりもはるかに高速です。
  • Cloud Shell - 約 40 GB 以下の小さなセットのコピーのためのオプション。 gcrane は、すでにアップロードされている画像レイヤのアップロードをスキップするため、この制限はコピーする新しいデータに対するものです。

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

    費用: コピーするイメージのネットワーク データ転送高速コピー オプションを使用している場合を除く)。

    • Cloud Shell セッションのロケーションは選択できません。現在のセッションの場所を確認するには、次のコマンドを実行します。
    curl metadata/computeMetadata/v1/instance/zone
    
    • 費用を最小にして、コピー速度を最大にするには、Container Registry と同じマルチリージョン内の Artifact Registry リポジトリを使用します。同じマルチリージョン内のデータ転送は課金されず、ロケーション間でコピーするよりもはるかに高速です。
  • ローカルマシン - その他のオプションを使用できない場合は、ローカルマシンから gcrane を実行できます。

    費用: コピーするイメージのネットワーク データ転送高速コピー オプションを使用する場合を除く)。

    費用を最小にして、コピー速度を最大にするには、Container Registry と同じマルチリージョン内の Artifact Registry リポジトリを使用します。同じマルチリージョン内のデータ転送は課金されず、ロケーション間でコピーするよりもはるかに高速です。

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 をインストールすると、Container Registry 内の既存のイメージを一覧表示して、コピーするものを見つけることができます。

既存のイメージを一覧表示するには、次のコマンドを実行します。

gcrane ls LOCATION.gcr.io/PROJECT

イメージのタグを一覧表示するには、次のコマンドを実行します。

gcrane ls LOCATION.gcr.io/PROJECT/IMAGE

特定のパスの下でイメージを再帰的に一覧表示するには、次のコマンドを実行します。

gcrane ls -r LOCATION.gcr.io/PROJECT/PATH

各コマンドで、次のようにします。

  • LOCATION は、レジストリのマルチリージョン(asiaeu、または us)に置き換えます。
  • PROJECT をプロジェクト ID で置き換えます。

イメージをコピーするためのコマンドについては、イメージのコピーをご覧ください。

イメージのコピー

Container Registry から個別のイメージ、ロケーションの指定パスにあるすべてのイメージ、またはロケーションに保存されているすべてのイメージをコピーできます。

単一のイメージをコピーする

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

gcrane cp GCR-LOCATION.gcr.io/PROJECT/IMAGE \
AR-LOCATION.pkg.dev/PROJECT/REPOSITORY/IMAGE

場所

  • GCR-LOCATION は、Container Registry ホストのマルチリージョン(asiaeu、または us)です。
  • AR-LOCATION は、リポジトリのリージョンまたはマルチリージョンです。
  • PROJECT は、プロジェクト ID です。
  • REPOSITORY は、Artifact Registry リポジトリの名前です。
  • GCR-IMAGE は、Container Registry からコピーするイメージです。
  • AR-IMAGE は Artifact Registry 内のイメージの名前です。

たとえば、次のソースと宛先のイメージについて考えてみます。

  • Container Registry のイメージ: eu.gcr.io/my-project/my-image:tag1
  • Artifact Registry のイメージ: europe-docker.pkg.dev/my-project/my-repo/my-image:tag1

次のコマンドを実行してイメージをコピーします。

gcrane cp eu.gcr.io/my-project/my-image:tag1 \
europe-docker.pkg.dev/my-project/my-repo/my-image:tag1

パスの下のすべてのイメージをコピーする

Container Registry の特定のパスの下でイメージを再帰的にコピーするには、次のコマンドを実行します。

gcrane cp -r GCR-LOCATION.gcr.io/PROJECT/GCR-PATH \
AR-LOCATION.pkg.dev/PROJECT/REPOSITORY/AR-PATH

場所

  • GCR-LOCATION は、Container Registry ホストのマルチリージョン(asiaeu、または us)です。
  • AR-LOCATION は、リポジトリのリージョンまたはマルチリージョンです。
  • PROJECT は、プロジェクト ID です。
  • REPOSITORY は、Artifact Registry リポジトリの名前です。
  • GCR-PATH は、コピーするファイルのパスです。
  • AR-PATH は、Artifact Registry リポジトリ内のイメージのパスです。

たとえば、次のソースと宛先のパスについて考えてみます。

  • Container Registry のパス: eu.gcr.io/my-project/test-images/testing
  • Artifact Registry のパス: europe-docker.pkg.dev/my-project/my-repo/test-images/testing

次のコマンドは、test-images/testing の配下に存在するすべてのイメージを my-repo リポジトリに再帰的にコピーします。

gcrane cp -r eu.gcr.io/my-project/test-images/testing \
europe-docker.pkg.dev/my-project/my-repo/test-images/testing

Container Registry のロケーションからのすべてのイメージのコピー

Container Registry のマルチリージョンからすべてのイメージをコピーするには、次のコマンドを実行します。

gcrane cp -r GCR-LOCATION.gcr.io/PROJECT \
AR-LOCATION.pkg.dev/PROJECT/REPOSITORY

場所

  • GCR-LOCATION は、Container Registry ホストのマルチリージョン(asiaeu、または us)です。
  • AR-LOCATION は、リポジトリのリージョンまたはマルチリージョンです。
  • PROJECT は、プロジェクト ID です。
  • REPOSITORY は、Artifact Registry リポジトリの名前です。

プロジェクト内の複数の Container Registry のロケーション用にイメージをコピーする場合は、ホストごとにコマンドを 1 回実行します。

たとえば、次のソース レジストリとターゲット Artifact Registry リポジトリについて考えてみましょう。この例では、Container Registry と Artifact Registry は別のプロジェクトにあります。

  • Container Registry のホスト: eu.gcr.io/my-project
  • Artifact Registry のイメージ: europe-docker.pkg.dev/new-project/my-repo

次のコマンドは、すべてのイメージをプロジェクト my-projecteu マルチリージョンからプロジェクト new-projectmy-repo リポジトリにコピーします。

gcrane cp -r eu.gcr.io/my-project \
europe-docker.pkg.dev/new-project/my-repo

Docker を使用するイメージのコピー

gcranegcloud のコピー方法とは異なり、この方法は 2 段階のプロセスです。

  1. Container Registry からイメージを pull します。
  2. イメージを Artifact Registry リポジトリに push します。

要件

次の要件を確認します。

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

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

    • ストレージ オブジェクト閲覧者(roles/storage.objectViewer)、または Container Registry ホストのストレージ バケットに対する同等の権限を持つロール。これらの権限の付与について学習します。

    • Artifact Registry 書き込み(roles/artifactregistry.writer)、または Artifact Registry リポジトリに対する同等の権限を持つロール。これらの権限の付与について学習します。

  3. Container RegistryArtifact Registry の両方を認証するように Docker を構成している。

費用

イメージを pull すると、ネットワーク データ転送に対して課金されます。具体的な料金は、pull コマンドの宛先によって異なります。たとえば Cloud Shell セッションからイメージを pull する場合は、Google Cloud 内のネットワーク データ転送の料金になります。Google Cloud の外部のマシンにイメージを pull する場合、一般的なネットワーク データ転送の料金になります。

Artifact Registry 内のイメージのタグ付け、push、pull に使用する Docker コマンドは、Container Registry で使用するものと似ています。次の 2 つの主な違いがあります。

  • Artifact Registry Docker リポジトリのホスト名には、-docker.pkg.dev が続く、ロケーションの接頭辞があります。australia-southeast1-docker.pkg.deveurope-north1-docker.pkg.deveurope-docker.pkg.dev などがあります。
  • Artifact Registry は、1 つのプロジェクトで複数の Docker リポジトリをサポートしているため、コマンドでリポジトリ名を指定する必要があります。

Docker を使用して Artifact Registry にイメージをコピーするには、Container Registry からイメージを pull してから Artifact Registry リポジトリにそれを push します。

たとえば、eu マルチリージョンの Container Registry イメージについて考えてみます。この場合に、europe リージョンの Artifact Registry リポジトリにコピーするとします。

  • Container Registry のイメージ: eu.gcr.io/my-project/my-image:tag1
  • Artifact Registry のイメージ: europe-docker.pkg.dev/my-project/my-repo/my-image:tag1

次のコマンドは、Container Registry からイメージを pull します。

docker pull eu.gcr.io/my-project/my-image:tag1

次のコマンドは、my-repo という名前の Artifact Registry リポジトリにイメージを push します。

docker push europe-north1-docker.pkg.dev/my-project/my-repo/my-image

別のプロジェクトで設定した Artifact Registry リポジトリにイメージを push することもできます。この例では、同じソースイメージをプロジェクト new-project のリポジトリ my-repo に push します。

docker push europe-north1-docker.pkg.dev/new-project/my-repo/my-image

Artifact Registry でのイメージの push および pull の詳細については、イメージの push と pull をご覧ください。

gcloud を使用したイメージのコピー

gcloud container images add-tag コマンドを使用して、Container Registry から Artifact Registry リポジトリにイメージをコピーします。

要件

次の要件を確認します。

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

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

    • ストレージ オブジェクト閲覧者(roles/storage.objectViewer)、または Container Registry ホストのストレージ バケットに対する同等の権限を持つロール。これらの権限の付与について学習します。

    • Artifact Registry 書き込み(roles/artifactregistry.writer)、または Artifact Registry リポジトリに対する同等の権限を持つロール。これらの権限の付与について学習します。

費用

Container Registry が Artifact Registry リポジトリとは異なる場所にある場合、コピーするイメージにはネットワーク データ転送が適用されます。両方のサービスが同じロケーションにある場合、ネットワークデータ転送は無料です。

次のコマンドを実行して、Container Registry から Artifact Registry にイメージをコピーします。

gcloud container images add-tag GCR-IMAGE AR-IMAGE

場所

  • GCR-IMAGE は、Container Registry イメージのフルパスです。
  • AR-IMAGE は Artifact Registry リポジトリ内のイメージのフルパスです。

たとえば、次のソースと宛先のイメージについて考えてみます。

  • Container Registry のイメージ: eu.gcr.io/my-project/my-image:tag1
  • Artifact Registry のイメージ: europe-docker.pkg.dev/my-project/my-repo/my-image:tag1

このコマンドは、マルチリージョン eu の Container Registry からマルチリージョン europe のリポジトリ my-repo にイメージをコピーします。

gcloud container images add-tag eu.gcr.io/my-project/my-image:tag1 \
europe-docker.pkg.dev/my-project/my-repo/my-image:tag1

別のプロジェクトで設定した Artifact Registry リポジトリにイメージをコピーすることもできます。この例では、同じソースイメージをプロジェクト new-project 内のリポジトリ my-repo にコピーします。

gcloud container images add-tag eu.gcr.io/my-project/my-image:tag1 \
europe-docker.pkg.dev/new-project/my-repo/my-image:tag1

次のステップ