Container Registry から Artifact Registry への移行の一環として、Artifact Registry に保持したい Container Registry イメージをコピーできます。
概要
Container Registry から Artifact Registry にイメージをコピーするための選択肢はいくつかあります。自動移行ツールでイメージをコピーすることをおすすめします。このツールは、複数のプロジェクトのコピーをサポートし、すでにリダイレクトが有効になっていてもイメージをコピーでき、他の方法より多くのデータを処理できるためです。
コストを削減するには、次のことを行います。
コンテナを Artifact Registry にコピーする前に、タグのない古いイメージを削除します。
イメージを標準(
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 から 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
が失敗する可能性があります。
要件
次の要件を確認します。
送信元と宛先の Google Cloud プロジェクトで Artifact Registry が有効になっている。
コピーするイメージ用の Docker リポジトリが Artifact Registry で作成済みである。
次の必要な権限が付与されている。
ストレージ オブジェクト閲覧者(
roles/storage.objectViewer
)、または Container Registry ホストのストレージ バケットに対する同等の権限を持つロール。これらの権限の付与について学習します。Artifact Registry 書き込み(
roles/artifactregistry.writer
)、または Artifact Registry リポジトリに対する同等の権限を持つロール。これらの権限の付与について学習します。
高速コピー オプションを使用するには、次の要件を確認します。
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
を使用してイメージをコピーするには:
- VM インスタンスを作成します。費用を最小にするには、コピー元のレジストリと同じロケーションにインスタンスを作成します。
デフォルトでは、VM インスタンスはデフォルトのサービス アカウントに関連付けられており、イメージを pull する権限があります。VM インスタンスがイメージを push できるように、アクセス スコープを変更する必要があります。
VM インスタンスを停止します。インスタンスの停止をご覧ください。
次のコマンドでアクセス スコープを変更します。
gcloud compute instances set-service-account INSTANCE --scopes=storage-rw
INSTANCE は VM インスタンスの名前に置き換えます。
VM インスタンスを再起動します。停止されたインスタンスの起動をご覧ください。
SSH を使用して VM インスタンスに接続します。
次のコマンドを実行して
gcrane
をダウンロードします。curl -L \ https://github.com/google/go-containerregistry/releases/latest/download/go-containerregistry_Linux_x86_64.tar.gz \ -o go-containerregistry.tar.gz
次のコマンドを実行して、
gcrane
コマンドを実行可能にします。tar -zxvf go-containerregistry.tar.gz chmod +x gcrane sudo mv gcrane /usr/local/bin/
コマンド
gcrane --help
を実行して、インストールを検証します。
これでイメージをコピーする準備が整いました。続行するには:
Cloud Shell の設定
Cloud Shell ウィンドウを開きます。
デフォルト プロジェクトを設定します。PROJECT は、Container Registry と Artifact Registry がインストールされているプロジェクトの ID に置き換えます。
gcloud config set project PROJECT
次のコマンドを実行して、
gcrane
ツールをダウンロードします。curl -L \ https://github.com/google/go-containerregistry/releases/latest/download/go-containerregistry_Linux_x86_64.tar.gz \ -o go-containerregistry.tar.gz
次のコマンドを実行して、
gcrane
コマンドを実行可能にします。tar -zxvf go-containerregistry.tar.gz chmod +x gcrane sudo mv gcrane /usr/local/bin/
コマンド
gcrane --help
を実行して、インストールを検証します。
これでイメージをコピーする準備が整いました。続行するには:
ローカルマシンの設定
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
次のコマンドを実行して、
gcrane
コマンドを実行可能にします。このコマンドでは、ダウンロードしたファイルの名前がgo-containerregistry.tar.gz
であることを仮定しています。tar -zxvf go-containerregistry.tar.gz chmod +x gcrane sudo mv gcrane /usr/local/bin/
コマンド
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
は、レジストリのマルチリージョン(asia
、eu
、または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 ホストのマルチリージョン(
asia
、eu
、または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 ホストのマルチリージョン(
asia
、eu
、または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 ホストのマルチリージョン(
asia
、eu
、または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-project
の eu
マルチリージョンからプロジェクト new-project
の my-repo
リポジトリにコピーします。
gcrane cp -r eu.gcr.io/my-project \
europe-docker.pkg.dev/new-project/my-repo
Docker を使用するイメージのコピー
gcrane と gcloud のコピー方法とは異なり、この方法は 2 段階のプロセスです。
- Container Registry からイメージを pull します。
- イメージを Artifact Registry リポジトリに push します。
要件
次の要件を確認します。
コピーするイメージ用の Docker リポジトリが Artifact Registry で作成済みである。
次の必要な権限が付与されている。
ストレージ オブジェクト閲覧者(
roles/storage.objectViewer
)、または Container Registry ホストのストレージ バケットに対する同等の権限を持つロール。これらの権限の付与について学習します。Artifact Registry 書き込み(
roles/artifactregistry.writer
)、または Artifact Registry リポジトリに対する同等の権限を持つロール。これらの権限の付与について学習します。
Container Registry と Artifact 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.dev
、europe-north1-docker.pkg.dev
、europe-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 リポジトリにイメージをコピーします。
要件
次の要件を確認します。
コピーするイメージ用の Docker リポジトリが Artifact Registry で作成済みである。
次の必要な権限が付与されている。
ストレージ オブジェクト閲覧者(
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
次のステップ
- 機能と gcloud CLI コマンドの比較など、Container Registry から Artifact Registry への移行の詳細を確認する。
- Docker の変更について確認する。
- Google Cloud でのビルドやデプロイのための変更について確認する。