gcrane
ツールを使用して、Artifact Registry の Docker リポジトリ間でイメージをコピーできます。
このツールを使用して、Container Registry から Artifact Registry にイメージをコピーすることもできます。
始める前に
次の要件を確認します。
コピーするイメージの、Artifact Registry でターゲット Docker リポジトリを作成している。
必要な権限がある。
コピー元のリポジトリに対して 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
を使用してイメージをコピーするには:
- 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
を実行して、インストールを検証します。
これで、イメージをコピーする準備ができました。続行するには:
ローカルマシンの設定
gcrane
を GitHub リポジトリからダウンロードします。たとえば、次のコマンドは、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
ツールをインストールした後、ソース リポジトリ内の既存のイメージを一覧表示して、コピーするイメージを見つけることができます。
既存のイメージを一覧表示するには、次のコマンドを実行します。
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