🚤

Skopeo で Docker Registry を同期する

2024/10/20に公開

背景

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