🚤
Skopeo で Docker Registry を同期する
背景
2つのDocker Registryを同期(コピー)させたい場合、docker pullとdocker pushで同期させることができる。しかしマルチプラットフォームビルドされたイメージを同期させたい場合において、使用しているPCのCPUアーキテクチャのイメージしか同期できないなどの問題がある。そのためskopeoを用いてマルチプラットフォームビルドのイメージの同期を行う。
環境
- Ubuntu 22.04 LTS
- Docker 24.0.7
- Skopeo 1.4.1
- CPU amd64 (x86_64)
Skopeoのインストール
Installing Skopeoを参考に以下を実行する。
sudo apt-get update
sudo apt-get -y install skopeo
Docker Registry の立ち上げ
以下のコマンドを実行し、ローカルのレジストリを立ち上げる。
sudo docker run -d -p 5000:5000 --name registry registry:2
hashicorp/boundary との同期
Docker Hubのhashicorp/boundaryとローカルのレジストリを同期させる。以下のコマンドで同期できる。
sudo skopeo sync --all --src docker --dest docker --dest-tls-verify=false docker.io/hashicorp/boundary localhost:5000
以下のコマンドを実行することで、同期されたレジストリのリポジトリを確認できる。
curl -X GET http://localhost:5000/v2/_catalog
{"repositories":["boundary"]}
以下のコマンドを実行することで、同期されたレジストリのリポジトリのタグを確認できる。
curl -X GET http://localhost:5000/v2/boundary/tags/list
{"name":"boundary","tags":["0.8","0.18","0.15.4","0.7","0.1.3","0.9.0","0.1.1","0.17.0","0.12.1","0.17","0.3.0","0.11.0","0.2.3","0.16.3","0.6.2","0.15","0.15.3","0.5.0","0.4.0","0.2.1","0.15.5","0.13","0.16.0","0.1.8","0.5.1","0.1.4","0.12.0","0.17.1","0.1.5","0.14.2","0.7.3","0.15.2","0.8.0","0.14.3","0.12","0.15.1","0.10.3","0.1.6","0.1.7","0.16","0.16.2","0.10.4","0.16.1","0.13.0","0.10.1","0.9.1","0.7.5","0.10.0","0.7.1","0.10","0.7.6","0.15.0","0.12.2","0.14","0.7.2","0.11.1","0.14.0","0.1.2","0.14.1","0.7.0","0.11.2","0.11","0.18.0","0.2.0","0.7.4","0.10.5","0.8.1","0.9","0.17.2","latest","0.2.2","0.14.5","0.6.0","0.13.1","0.6.1","0.10.2"]}``
以下のコマンドを実行することで、同期されたレジストリのリポジトリのタグのプラットフォームを確認できる。
sudo skopeo inspect --tls-verify=false --raw docker://localhost:5000/boundary:0.18
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"manifests": [
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 2199,
"digest": "sha256:067fe7ce6f3635558a3c7b4659117481c3c1bbf7becec653a0533db875a91d8d",
"platform": {
"architecture": "arm",
"os": "linux",
"variant": "v6"
}
},
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 2199,
"digest": "sha256:4dbb5acb60841ccf218aa0ed65dac5ef29270186ba1cfa1daa281910df7822e8",
"platform": {
"architecture": "386",
"os": "linux"
}
},
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 2199,
"digest": "sha256:adee2edfe78395a8ee1505618bb44fc1724a7cdbde9080981adc00528d6c5f14",
"platform": {
"architecture": "amd64",
"os": "linux"
}
},
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 2199,
"digest": "sha256:fb84f3304326b397762d1188f7ae80dcba81b5415295469af156da5b6bb995bd",
"platform": {
"architecture": "arm64",
"os": "linux"
}
}
]
}
Discussion