gcrane
ツールを使用して、Artifact Registry の Docker リポジトリ間でイメージをコピーできます。
始める前に
次の要件を確認します。
コピーするイメージ用の 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
を実行して、インストールを検証します。
これでイメージをコピーする準備が整いました。続行するには:
ローカルマシンの設定
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
ツールをインストールしたら、ソース リポジトリ内の既存のイメージを一覧表示して、コピーするイメージを見つけることができます。
既存のイメージを一覧表示するには、次のコマンドを実行します。
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
次のコマンドは、リポジトリ repo1
の test-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