on
マルチアーキテクチャのコンテナイメージをコピーする skopeo
TL;DR
- コンテナイメージをコピーするには、docker pull/push ではなく、skopeo が便利
- デーモンレスなので、dockerd や containerd を必要としない
- ホストの CPU アーキテクチャに依存せずマルチアーキテクチャのイメージも簡単にコピーできる
skopeo
skopeo は OCI アーティファクトを操作する CLI です。 Podman で有名な containers で管理されており Red Hat でも紹介されているため信頼できるツールと言えます。
Skopeo の仕組み
Skopeo (ギリシャ語で「リモートビューイング」) は、Red Hat のエンジニアがオープンソース・コミュニティと共に開発した最初のコンテナツールです。
コピー
例 1
以下、東京リージョンの ECR イメージを大阪リージョンにコピーする例です。
大阪リージョン、東京リージョンでそれぞれ ECR のための(Docker)認証情報を取得し、docker login と同じように skopeo に読み込ませます。
手元の MAC では ~/.config/containers/auth.json
に保持されていました。ドキュメントによると skopeo login しなければ $HOME/.docker/config.json
を見に行ってくれるらしいです。
skopeo copy コマンドでコピー元の ECR イメージと、コピー先の ECR リポジトリを指定します。 –all オプションを指定することで、マルチアーキテクチャのイメージをコピーします。
$ aws ecr get-login-password --region ap-northeast-1 | skopeo login --username AWS --password-stdin account.dkr.ecr.ap-northeast-1.amazonaws.com
$ aws ecr get-login-password --region ap-northeast-3 | skopeo login --username AWS --password-stdin account.dkr.ecr.ap-northeast-3.amazonaws.com
$ skopeo copy docker://account.dkr.ecr.ap-northeast-1.amazonaws.com/amazonlinux:multi-arch docker://account.dkr.ecr.ap-northeast-3.amazonaws.com/amazonlinux:latest --all
docker を使う場合、pull して push する手順を踏む必要があります。また、docker pull はホストの CPU アーキテクチャのイメージを自動で pull するため、マルチアーキテクチャのイメージをコピーするのが苦手です。skopeo で –all オプションを使った方がお手軽です。
例 2
Docker レジストリのイメージを ECR にコピーする例
$ aws ecr get-login-password --region ap-northeast-1 | skopeo login --username AWS --password-stdin account.dkr.ecr.ap-northeast-1.amazonaws.com
$ skopeo copy docker://docker.io/library/amazonlinux:latest docker://account.dkr.ecr.ap-northeast-3.amazonaws.com/amazonlinux:latest --all
その他
sync コマンドもあるようなので、リポジトリの複数のイメージをコピーする場合はこっちが便利かもしれません(未検証)。