コンテナイメージをコンテナレジストリ間でコピーする

Red HatでOpenShiftのサポートをしているid:nekopです。OpenShift 全部俺 Advent Calendar 2018 - Qiitaの3日目のエントリです。

OpenShiftのJenkins Pipelineビルドなどを利用して、コンテナイメージをあるレジストリから別のレジストリにコピーしたかったりすることがあります。そんなときのためにoc image mirrorというコマンドがあります。

とりあえず手元でレジストリを2つ動作させて、適当なイメージをコピーしてみます。Fedora 29でpodmanを利用しているので全てnon-rootの一般ユーザです。RHELのpodmanではまだsudoが必要だと思います。

podman run -d --name=r1 registry:2
podman run -d --name=r2 registry:2
podman inspect r1 | grep IPAddress
            "IPAddress": "10.88.0.3",
podman inspect r2 | grep IPAddress
            "IPAddress": "10.88.0.4",

レジストリのイメージが手元にあるのでそのままテストイメージとして利用し、r1にpushします。

$ podman tag docker.io/library/registry:2 10.88.0.3:5000/test/registry:2
$ podman push 10.88.0.3:5000/test/registry:2 --tls-verify=false
Getting image source signatures
Copying blob sha256:a120b7c9a693292190f50bc37e5847c7da5428e1852995e303bb1c718ed567d6
 4.83 MB / 4.83 MB [========================================================] 0s
Copying blob sha256:2b7bd2eefde24f621426f0d42036bb53b141f8d2ef734afd37ca5a8897662506
 7.57 MB / 7.57 MB [========================================================] 0s
Copying blob sha256:00a8ff67f927f16e8895c3fd541517c9cc8dfa1d2b81eecfabf9045d1e5e5e39
 21.74 MB / 21.74 MB [======================================================] 1s
Copying blob sha256:dead8a13b621ef850bc2f6b8ec33130b91f8fa59ac0a465b7de3a76558ebd20e
 3.50 KB / 3.50 KB [========================================================] 0s
Copying blob sha256:6b263b6e9ced9ada82d497c4a351653140f5f59dbb6a2cc099d54292a308edff
 2.00 KB / 2.00 KB [========================================================] 0s
Copying config sha256:2e2f252f3c88679f1207d87d57c07af6819a1a17e22573bcef32804122d2f305
 3.09 KB / 3.09 KB [========================================================] 0s
Writing manifest to image destination

これをoc image mirrorコマンドを利用してコピーしてみます。

$ oc image mirror 10.88.0.3:5000/test/registry:2 10.88.0.4:5000/test/registry:2 --insecure
10.88.0.4:5000/
  test/registry
    blobs:
      10.88.0.3:5000/test/registry sha256:bcd4a541795bb9981999ce8f6e2e1c92e55b0041256153d2458ff35fb9381063 212B
      10.88.0.3:5000/test/registry sha256:f296fda86f10cfcb81d60d5bcb47a7784a8ec4876d6eac7fabd51f2a7e8694aa 369B
      10.88.0.3:5000/test/registry sha256:2e2f252f3c88679f1207d87d57c07af6819a1a17e22573bcef32804122d2f305 3.091KiB
      10.88.0.3:5000/test/registry sha256:ad0eac849f8f2014e20df11d611e4453c94a365a71eb3a90f02d8500391e1787 1.94MiB
      10.88.0.3:5000/test/registry sha256:d6a5679aa3cfc52503fac8e2345790783537564df5af43355ec662d7703aacbf 2.277MiB
      10.88.0.3:5000/test/registry sha256:2261ba058a15e3f21a467b1b02ea206d40cf0632d6b1aeee2ad200b662ed4aff 5.975MiB
    manifests:
      sha256:0e51cf12fb097201ded5b7daf648860d5a7ee806a7e9f6feaec3dc18f109d9dd -> 2
  stats: shared=0 unique=6 size=10.2MiB ratio=1.00

phase 0:
  10.88.0.4:5000 test/registry blobs=6 mounts=0 manifests=1 shared=0

info: Planning completed in 10ms
uploading: 10.88.0.4:5000/test/registry sha256:d6a5679aa3cfc52503fac8e2345790783537564df5af43355ec662d7703aacbf 2.277MiB
uploading: 10.88.0.4:5000/test/registry sha256:ad0eac849f8f2014e20df11d611e4453c94a365a71eb3a90f02d8500391e1787 1.94MiB
uploading: 10.88.0.4:5000/test/registry sha256:2261ba058a15e3f21a467b1b02ea206d40cf0632d6b1aeee2ad200b662ed4aff 5.975MiB
sha256:0e51cf12fb097201ded5b7daf648860d5a7ee806a7e9f6feaec3dc18f109d9dd 10.88.0.4:5000/test/registry:2
info: Mirroring completed in 110ms (93.01MB/s)

oc image mirrorコマンドはレジストリのログイン情報などについてはdockerの設定ファイル$HOME/.docker/config.jsonを参照するので、レジストリに認証が必要な場合は事前に配置しておく必要があります。

同じ事はskopeoコマンドでも可能です。skopeoの場合は--src-credsなど認証情報もパラメータとしてパスできます。

$ skopeo copy docker://10.88.0.3:5000/test/registry:2 docker://10.88.0.4:5000/test2/registry:2 --src-tls-verify=false --dest-tls-verify=false
Getting image source signatures
Copying blob sha256:d6a5679aa3cfc52503fac8e2345790783537564df5af43355ec662d7703aacbf
 2.28 MB / 2.28 MB [========================================================] 0s
Copying blob sha256:ad0eac849f8f2014e20df11d611e4453c94a365a71eb3a90f02d8500391e1787
 1.94 MB / 1.94 MB [========================================================] 0s
Copying blob sha256:2261ba058a15e3f21a467b1b02ea206d40cf0632d6b1aeee2ad200b662ed4aff
 5.98 MB / 5.98 MB [========================================================] 0s
Copying blob sha256:f296fda86f10cfcb81d60d5bcb47a7784a8ec4876d6eac7fabd51f2a7e8694aa
 369 B / 369 B [============================================================] 0s
Copying blob sha256:bcd4a541795bb9981999ce8f6e2e1c92e55b0041256153d2458ff35fb9381063
 212 B / 212 B [============================================================] 0s
Copying config sha256:2e2f252f3c88679f1207d87d57c07af6819a1a17e22573bcef32804122d2f305
 3.09 KB / 3.09 KB [========================================================] 0s
Writing manifest to image destination
Storing signatures

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。