【ITニュース解説】How to Migrate ECR Docker Images Between Repositories (with Automation)
2025年09月24日に「Dev.to」が公開したITニュース「How to Migrate ECR Docker Images Between Repositories (with Automation)」について初心者にもわかりやすく解説しています。
ITニュース概要
Amazon ECRでDockerイメージを別リポジトリへ移行する際、手動では時間と手間がかかる。この記事では、`skopeo`を使った自動化スクリプトを紹介する。イメージを直接コピーし、移行先リポジトリも自動作成するため、作業を効率化し開発者の負担を減らすことができる。
ITニュース解説
Dockerイメージの管理において、Amazon ECR(Elastic Container Registry)は、コンテナ化されたアプリケーションを開発する上で非常に重要なサービスである。しかし、時間の経過と共にプロジェクトが発展したり、チームの運用方針が変わったりすると、ECR内に保存されているDockerイメージを、あるリポジトリから別のリポジトリへ移行する必要が生じることがある。例えば、リポジトリの命名規則を変更したり、より整理された新しいリポジトリ構造を導入したり、単に古いリポジトリを整理したりする場合などがこれに該当する。このようなイメージ移行の作業を手動で行う場合、一つ一つのイメージをローカル環境にダウンロードし、新しいタグを付け、その後再び移行先のリポジトリへアップロードするという手順を繰り返す必要があり、非常に手間と時間がかかる。特に、頻繁に更新される開発環境では、このような手作業はチームの生産性を大きく低下させる原因となりかねない。
このような手作業の課題を解決するため、記事ではECRイメージの移行を自動化するスクリプトが紹介されている。このスクリプトは、コンテナイメージを効率的に扱うためのツールである「skopeo(スコペオ)」を内部で利用している。skopeoを使うことで、イメージを一度ローカルにダウンロードしてから再度アップロードする手間を省き、ECRレジストリ間で直接イメージをコピーすることが可能になる。これにより、イメージ移行作業が迅速かつ安全に行える。
このスクリプトを実行するには、いくつかの前提条件がある。まず、AWSサービスをコマンドラインから操作するためのツール「AWS CLI」が設定済みである必要がある。この際、ECRリポジトリにアクセスするための適切な権限を持つAWSプロファイルが設定されていることが前提となる。次に、JSON形式のデータをコマンドラインで処理・フィルタリングするためのツール「jq」が必要である。AWS CLIが出力するJSON形式の情報をスクリプトが解析するために利用される。そして、最も重要なのが「skopeo」である。これは、異なるコンテナレジストリ間でイメージをコピーしたり、内容を検査したりするために特化して設計されたツールであり、本スクリプトの中核をなす。
skopeoのインストール方法は利用しているオペレーティングシステムによって異なる。macOSユーザーはHomebrewパッケージマネージャーを使ってbrew install skopeoと実行すれば良い。UbuntuやDebianなどのLinuxディストリビューションでは、まずパッケージリストを更新(sudo apt-get update)し、その後にsudo apt-get -y install skopeoコマンドでインストールできる。Windowsユーザーの場合、WSL2(Windows Subsystem for Linux 2)を使用していればUbuntuの手順を適用でき、そうでなければChocolateyパッケージマネージャーを使ってchoco install skopeoでインストールする。
紹介されている移行スクリプト「migrate-ecr-images.sh」は、指定されたソースECRリポジトリからデスティネーションECRリポジトリへ、過去N日間にプッシュされた全てのDockerイメージを移行することを目的としている。
スクリプトはまず、skopeoがシステムにインストールされているかを確認し、もしmacOS環境でHomebrewが利用可能であれば、skopeoがなければ自動的にインストールを試みる。
スクリプトの主要な設定変数には、移行元リポジトリ名を設定するSRC_REPO、移行先リポジトリ名を設定するDST_REPO、移行対象とするイメージのプッシュ時期を日数で指定するWINDOW_DAYS、そして実際にイメージのコピーを行わずに動作の確認だけを行うためのDRY_RUN(真偽値)がある。
スクリプトは次に、AWS CLIの設定から現在のAWSリージョンとアカウントIDを自動的に検出し、ECRレジストリのホスト名を構築する。これにより、スクリプトは環境に依存せず汎用的に動作する。
日付の計算については、利用しているOS(BSD系またはGNU系)の日付コマンドの違いを自動で判別し、WINDOW_DAYSで指定された期間より古いイメージをフィルタリングするための基準日時(エポック秒)を算出する。
移行先のECRリポジトリが存在しない場合は、aws ecr create-repositoryコマンドを使って自動的にリポジトリが作成される。この際、オプションとしてイメージタグの変更可能性をMUTABLEに設定する処理も行われる。
ECRへのアクセスには認証情報が必要となるため、スクリプトはaws ecr get-login-passwordコマンドを実行して一時的なパスワードを取得し、skopeoがECRへの認証に利用できるように準備する。
移行対象となるイメージタグの収集は、aws ecr describe-imagesコマンドでソースリポジトリのイメージ詳細情報を取得し、そのJSON出力をjqで処理することで行われる。具体的には、イメージのプッシュ日時(imagePushedAt)と関連するタグ(imageTags)を抽出し、先に算出した基準日時と比較して、WINDOW_DAYS以内にプッシュされたタグのみをフィルタリングしてリストアップする。
最後に、このリストアップされた各タグについて、skopeoを使ってイメージのコピーを実行する。skopeoのcopy --allコマンドは、イメージの全ての層とマニフェストを、ソースレジストリからデスティネーションレジストリへ直接転送する機能を持つ。認証情報には、事前に取得したAWSのパスワードが利用される。もしDRY_RUNがtrueに設定されていれば、実際のコピーは行われず、実行されるはずのコマンドだけが表示され、ユーザーは変更内容を事前に確認できる。コピーに失敗したイメージがあれば記録され、スクリプトの実行終了時にその結果が報告される。処理中に作成された一時ファイルは適切にクリーンアップされる。
このスクリプトの動作原理は非常に効率的である。aws ecr describe-imagesコマンドを利用して、指定期間内にプッシュされたイメージタグを正確に特定する。次に、移行先のECRリポジトリが存在しない場合には自動的に作成するため、手動での準備作業が不要になる。最も重要な点は、skopeoツールを介してイメージをコピーすることで、一般的に行われる「ローカルにイメージをプル(ダウンロード)し、その後デスティネーションにプッシュ(アップロード)する」という二段階の手順が不要になり、レジストリ間で直接、より高速な転送が可能になる点である。また、DRY_RUN=trueモードを備えているため、実際の変更を伴わないシミュレーション実行が可能であり、予期せぬ問題を事前に発見し、安全に移行作業を進められる。
このスクリプトは、手動での作業と比較して大幅な時間節約を実現し、リポジトリの自動作成機能によって運用が簡素化されるため、開発チームが本質的なコーディング作業に集中できるよう、生産性の向上に貢献する。さらに、macOS、Ubuntu、Windows(WSL経由)といった主要なプラットフォームで動作するため、利用環境を選ばないという大きな利点も持つ。
この自動化スクリプトは、AWS ECRを利用する上で遭遇する可能性のあるイメージ移行の課題を効率的に解決し、チームの作業を大いに助ける強力なツールとなる。