0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Image Registry - Multi-Architecture Image (push)

Last updated at Posted at 2022-07-06

Image Registry では、Image Manifest V 2, Schema 2 から Multi-Architecture Image の使用が可能になりました。これによって、単一の Image Repository で複数 Architecture Image を扱う事ができます。

ここでは、Red Hat Enterprise Linux 8 (RHEL8) 環境で buildah (ビルダー)で作成した Multi-Architecture Image を Image Registry に登録(push)する方法をご紹介します。

登録先の Image Registry には、IBM Cloud Container Registry (ICR) を使用します。
Getting started with IBM Cloud Container Registry
https://cloud.ibm.com/docs/Registry?topic=Registry-getting-started&locale=en

ibmcloud CLI の導入

ibmcloud CLI は以下の手順で導入します。
Getting started with the IBM Cloud CLI
https://cloud.ibm.com/docs/cli?topic=cli-getting-started

ICR 管理用に Plugin も導入します。
Installing IBM Cloud Container Registry CLI plug-in
https://cloud.ibm.com/docs/cli?topic=cli-install-devtools-manually#idt-install-container-registry-cli-plugin

ここでは、以下のバージョンを使用します。

$ ibmcloud --version
ibmcloud version 2.9.0+6abd6f8-2022-07-05T14:46:06+00:00

$ ibmcloud plugin list
Listing installed plug-ins...

Plugin Name          Version   Status   Private endpoints supported
container-registry   0.1.571            true

ICR の準備

ICR の Registry URL を確認します。jp.icr.io が Registry URL になります。

$ ibmcloud cr info

Plugin version                    0.1.571
Container Registry                jp.icr.io
Container Registry API endpoint   https://jp.icr.io/api
IBM Cloud API endpoint            https://cloud.ibm.com
IBM Cloud account details         My Account (**************************)

ICR に login します。ここでは podman/buildah を使用しているため、--client podman を指定します。

$ ibmcloud cr login --client podman
Logging 'podman' in to 'jp.icr.io'...
Logged in to 'jp.icr.io'.

OK

$ podman login --get-login jp.icr.io
iamrefresh

Container Image を push するために Namespace を作成します。ここでは multi-arch を作成してみます。

$ ibmcloud cr namespace-add multi-arch
No resource group is targeted. Therefore, the default resource group for the account ('Default') is targeted.

Adding namespace 'multi-arch' in resource group 'Default' for account My Account in registry jp.icr.io...

Successfully added namespace 'multi-arch'

OK

$ ibmcloud cr namespace-list
Listing namespaces for account 'My Account' in registry 'jp.icr.io'...

Namespace
multi-arch

OK

Container Image の登録(push)

以下で作成した Multi-Architecture Image を push します。
Image Registry - Multi-Architecture Image (build)
https://qiita.com/qiita2021user/items/a86cf0ddb89c5684d991

$ podman image ls
REPOSITORY                TAG         IMAGE ID      CREATED       SIZE
<none>                    <none>      7bbb6158020b  26 hours ago  5.86 MB
<none>                    <none>      75b399a47312  26 hours ago  5.86 MB
<none>                    <none>      e4a11a4a273e  26 hours ago  5.86 MB
<none>                    <none>      c3d510a1d552  26 hours ago  5.86 MB
<none>                    <none>      ef8bf7982aac  26 hours ago  5.86 MB
<none>                    <none>      bd2d524da383  26 hours ago  5.86 MB
<none>                    <none>      0bc3e2b24ac7  26 hours ago  5.86 MB
localhost/buildah-test    1.0         0e17508509df  26 hours ago  3.4 kB
docker.io/library/alpine  3.15        0ac33e5f5afa  3 months ago  5.86 MB

buildah manifest push --all コマンドで Manifest List 内の全ての Container Image を push することができます。
ここでは、Image Registry の Repository URL に jp.icr.io/multi-arch/buildah-test:1.0 を使用してみます。

$ buildah manifest push --all localhost/buildah-test:1.0 docker://jp.icr.io/multi-arch/buildah-test:1.0
Getting image list signatures
Copying 7 of 7 images in list
Copying image sha256:1def9f292fe6c71942019875c56dded13fc467f8094176bfc24f3a4e6a19402c (1/7)
Getting image source signatures
Copying blob 1856f948c4bf done
Copying blob 4fc242d58285 done
Copying config 0bc3e2b24a done
Writing manifest to image destination
Storing signatures
Copying image sha256:ac8f1f8fb9169c403633c8caeeed882d6b92a6b4250514e1db8201145815ddaf (2/7)
Getting image source signatures
Copying blob b9a243c34cc6 done
Copying blob 4fc242d58285 skipped: already exists
Copying config bd2d524da3 done
Writing manifest to image destination
Storing signatures
Copying image sha256:9b71ab565a7beed5ba7d5b11ecac66c158bfa6cf95ee6f70cb150a380a93d90d (3/7)
Getting image source signatures
Copying blob 2242870f94ee done
Copying blob 4fc242d58285 skipped: already exists
Copying config ef8bf7982a done
Writing manifest to image destination
Storing signatures
Copying image sha256:70093b577d1be1ed69566e652c21ae06c6411844d855c92e669ba2729d10a48e (4/7)
Getting image source signatures
Copying blob 116ebe7e0830 done
Copying blob 4fc242d58285 skipped: already exists
Copying config c3d510a1d5 done
Writing manifest to image destination
Storing signatures
Copying image sha256:d5b46aadbf0a670f18c147ff064ed1d1a8bebad4b5fc07bb6ac63fd35157ec62 (5/7)
Getting image source signatures
Copying blob 9b3308c1e38e done
Copying blob 4fc242d58285 skipped: already exists
Copying config e4a11a4a27 done
Writing manifest to image destination
Storing signatures
Copying image sha256:f8e04bb902f5030962499b25615419f9b63d497cf1ad7a3cf7af0b672742b058 (6/7)
Getting image source signatures
Copying blob 04665ad84dbc done
Copying blob 4fc242d58285 skipped: already exists
Copying config 75b399a473 done
Writing manifest to image destination
Storing signatures
Copying image sha256:85e206c5a2c071bed43a5caad263cbee58a0bd1a3a49203b00cda229a45abc59 (7/7)
Getting image source signatures
Copying blob 5dec57fd26af done
Copying blob 4fc242d58285 skipped: already exists
Copying config 7bbb615802 done
Writing manifest to image destination
Storing signatures
Writing manifest list to image destination
Storing list signatures

表示されるログから、Manifest List にある以下の7個の Container Image が処理されたことがわかります。

$ podman manifest inspect localhost/buildah-test:1.0 | jq -r '.manifests[].digest'
sha256:1def9f292fe6c71942019875c56dded13fc467f8094176bfc24f3a4e6a19402c
sha256:ac8f1f8fb9169c403633c8caeeed882d6b92a6b4250514e1db8201145815ddaf
sha256:9b71ab565a7beed5ba7d5b11ecac66c158bfa6cf95ee6f70cb150a380a93d90d
sha256:70093b577d1be1ed69566e652c21ae06c6411844d855c92e669ba2729d10a48e
sha256:d5b46aadbf0a670f18c147ff064ed1d1a8bebad4b5fc07bb6ac63fd35157ec62
sha256:f8e04bb902f5030962499b25615419f9b63d497cf1ad7a3cf7af0b672742b058
sha256:85e206c5a2c071bed43a5caad263cbee58a0bd1a3a49203b00cda229a45abc59

実行結果の確認

ICR 側での確認

ICR に登録された Multi-Architecture-Image を確認してみます。

$ ibmcloud cr image-list --show-type --no-trunc
Listing images...

Repository                          Tag   Digest                                                                    Namespace    Created   Size     Security status   Type
jp.icr.io/multi-arch/buildah-test   1.0   sha256:92251cd314782a2ef92a73b8ac8c9f2462337f6004a87ef9bd92ff9adad7f067   multi-arch   -         1.5 kB   -                 OCI Image Index v1

OK

$ ibmcloud cr manifest-inspect -q jp.icr.io/multi-arch/buildah-test:1.0 | jq -r .
{
  "schemaVersion": 2,
  "mediaType": "application/vnd.oci.image.index.v1+json",
  "manifests": [
    {
      "mediaType": "application/vnd.oci.image.manifest.v1+json",
      "digest": "sha256:387922dcf0e66c7c611e913db52eb5e1545b80105824b8d0d2894837d6312001",
      "size": 758,
      "platform": {
        "architecture": "amd64",
        "os": "linux"
      }
    },
    {
      "mediaType": "application/vnd.oci.image.manifest.v1+json",
      "digest": "sha256:542dbf4b1d6a14194dd89f9c0e445664f5607d0346866beb5d74d88f05af41f2",
      "size": 758,
      "platform": {
        "architecture": "s390x",
        "os": "linux"
      }
    },
    {
      "mediaType": "application/vnd.oci.image.manifest.v1+json",
      "digest": "sha256:71fb3164a697aa866a95cedb4516939caddd510ef1105d221dacf95a3b818a51",
      "size": 758,
      "platform": {
        "architecture": "arm",
        "os": "linux",
        "variant": "v6"
      }
    },
    {
      "mediaType": "application/vnd.oci.image.manifest.v1+json",
      "digest": "sha256:73d1d586be1b6f79626fb5604793fb6d2fe234320074e373ff3f301e8bef10b3",
      "size": 758,
      "platform": {
        "architecture": "arm",
        "os": "linux",
        "variant": "v7"
      }
    },
    {
      "mediaType": "application/vnd.oci.image.manifest.v1+json",
      "digest": "sha256:81f84c10b4ba1aaf5deb23cafe946d932e1298a0efacf058e9f566fe8f6dffb5",
      "size": 758,
      "platform": {
        "architecture": "arm64",
        "os": "linux"
      }
    },
    {
      "mediaType": "application/vnd.oci.image.manifest.v1+json",
      "digest": "sha256:3b3cd654b1fbb481dadb25c98e889cc4edc97f5581ef114c3bce2aaed1075b74",
      "size": 758,
      "platform": {
        "architecture": "386",
        "os": "linux"
      }
    },
    {
      "mediaType": "application/vnd.oci.image.manifest.v1+json",
      "digest": "sha256:304a6bdfcaad365a31abbb7aba205b37611cd19934901cdcf9f812bbc70b3e04",
      "size": 758,
      "platform": {
        "architecture": "ppc64le",
        "os": "linux"
      }
    }
  ]
}

$ ibmcloud cr manifest-inspect -q jp.icr.io/multi-arch/buildah-test:1.0 | jq -r '.manifests[].digest'
sha256:387922dcf0e66c7c611e913db52eb5e1545b80105824b8d0d2894837d6312001
sha256:542dbf4b1d6a14194dd89f9c0e445664f5607d0346866beb5d74d88f05af41f2
sha256:71fb3164a697aa866a95cedb4516939caddd510ef1105d221dacf95a3b818a51
sha256:73d1d586be1b6f79626fb5604793fb6d2fe234320074e373ff3f301e8bef10b3
sha256:81f84c10b4ba1aaf5deb23cafe946d932e1298a0efacf058e9f566fe8f6dffb5
sha256:3b3cd654b1fbb481dadb25c98e889cc4edc97f5581ef114c3bce2aaed1075b74
sha256:304a6bdfcaad365a31abbb7aba205b37611cd19934901cdcf9f812bbc70b3e04

Manifest List に7個の Container Image が登録されていることが分かります。

RHEL8 側での確認

以下の要領で Multi-Architecture Image を確認してみます。
Image Registry - Multi-Architecture Image (inspect / pull)
https://qiita.com/qiita2021user/items/515dae5612dedbffde4a

$ podman manifest inspect jp.icr.io/multi-arch/buildah-test:1.0
{
    "schemaVersion": 2,
    "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
    "manifests": [
        {
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "size": 758,
            "digest": "sha256:387922dcf0e66c7c611e913db52eb5e1545b80105824b8d0d2894837d6312001",
            "platform": {
                "architecture": "amd64",
                "os": "linux"
            }
        },
        {
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "size": 758,
            "digest": "sha256:542dbf4b1d6a14194dd89f9c0e445664f5607d0346866beb5d74d88f05af41f2",
            "platform": {
                "architecture": "s390x",
                "os": "linux"
            }
        },
        {
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "size": 758,
            "digest": "sha256:71fb3164a697aa866a95cedb4516939caddd510ef1105d221dacf95a3b818a51",
            "platform": {
                "architecture": "arm",
                "os": "linux",
                "variant": "v6"
            }
        },
        {
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "size": 758,
            "digest": "sha256:73d1d586be1b6f79626fb5604793fb6d2fe234320074e373ff3f301e8bef10b3",
            "platform": {
                "architecture": "arm",
                "os": "linux",
                "variant": "v7"
            }
        },
        {
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "size": 758,
            "digest": "sha256:81f84c10b4ba1aaf5deb23cafe946d932e1298a0efacf058e9f566fe8f6dffb5",
            "platform": {
                "architecture": "arm64",
                "os": "linux"
            }
        },
        {
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "size": 758,
            "digest": "sha256:3b3cd654b1fbb481dadb25c98e889cc4edc97f5581ef114c3bce2aaed1075b74",
            "platform": {
                "architecture": "386",
                "os": "linux"
            }
        },
        {
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "size": 758,
            "digest": "sha256:304a6bdfcaad365a31abbb7aba205b37611cd19934901cdcf9f812bbc70b3e04",
            "platform": {
                "architecture": "ppc64le",
                "os": "linux"
            }
        }
    ]
}
$ podman manifest inspect jp.icr.io/multi-arch/buildah-test:1.0 | jq -rc '.manifests[].platform'
{"architecture":"amd64","os":"linux"}
{"architecture":"s390x","os":"linux"}
{"architecture":"arm","os":"linux","variant":"v6"}
{"architecture":"arm","os":"linux","variant":"v7"}
{"architecture":"arm64","os":"linux"}
{"architecture":"386","os":"linux"}
{"architecture":"ppc64le","os":"linux"}
$ skopeo inspect --override-arch=arm --override-os=linux --override-variant=v7 docker://jp.icr.io/multi-arch/buildah-test:1.0
{
    "Name": "jp.icr.io/multi-arch/buildah-test",
    "Digest": "sha256:92251cd314782a2ef92a73b8ac8c9f2462337f6004a87ef9bd92ff9adad7f067",
    "RepoTags": [
        "1.0"
    ],
    "Created": "2022-07-05T06:04:36.885248758Z",
    "DockerVersion": "",
    "Labels": {
        "io.buildah.version": "1.24.2"
    },
    "Architecture": "arm",
    "Os": "linux",
    "Layers": [
        "sha256:6d34a08ca0d03c74fe8515811e6a1806c5c8799297c032a418c660b76a13836c",
        "sha256:bf4892210806256b8358e6e1d86a46ac17f1caa702530a1032309dc6213de4d4"
    ],
    "Env": [
        "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    ]
}
$  skopeo inspect --config --override-arch=arm --override-os=linux --override-variant=v7 docker://jp.icr.io/multi-arch/buildah-test:1.0
{
    "created": "2022-07-05T06:04:36.885248758Z",
    "architecture": "arm",
    "os": "linux",
    "config": {
        "Env": [
            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
        ],
        "Entrypoint": [
            "/usr/bin/start.sh"
        ],
        "Labels": {
            "io.buildah.version": "1.24.2"
        }
    },
    "rootfs": {
        "type": "layers",
        "diff_ids": [
            "sha256:4fc242d58285699eca05db3cc7c7122a2b8e014d9481f323bd9277baacfa0628",
            "sha256:116ebe7e0830a7e8fb83f3d70e998940a8e4c21ca80c6ee288845ed856dad686"
        ]
    },
    "history": [
        {
            "created": "2022-04-05T00:19:59.790636867Z",
            "created_by": "/bin/sh -c #(nop) ADD file:5d673d25da3a14ce1f6cf66e4c7fd4f4b85a3759a9d93efb3fd9ff852b5b56e4 in / "
        },
        {
            "created": "2022-04-05T00:19:59.912662499Z",
            "created_by": "/bin/sh -c #(nop)  CMD [\"/bin/sh\"]",
            "empty_layer": true
        },
        {
            "created": "2022-07-05T06:04:36.442780866Z",
            "created_by": "/bin/sh -c #(nop) ADD file:29224fab6275fcbcfeb9e59d018598d1ced47483889d97bc4ed12e8a41c8184f in /usr/bin ",
            "empty_layer": true
        },
        {
            "created": "2022-07-05T06:04:36.884863127Z",
            "created_by": "/bin/sh -c chmod a+x /usr/bin/start.sh",
            "empty_layer": true
        },
        {
            "created": "2022-07-05T06:04:37.000344163Z",
            "created_by": "/bin/sh -c #(nop) ENTRYPOINT [\"/usr/bin/start.sh\"]",
            "comment": "FROM docker.io/library/alpine:3.15"
        }
    ]
}

ICR から Container Image を pull してみます。

$ podman pull jp.icr.io/multi-arch/buildah-test:1.0
Trying to pull jp.icr.io/multi-arch/buildah-test:1.0...
Getting image source signatures
Copying blob 0ecd89e35dd4 done
Copying blob 6d34a08ca0d0 done
Copying config 0bc3e2b24a done
Writing manifest to image destination
Storing signatures
0bc3e2b24ac7e76f1fa58f4ad60d41ec596f4188dbe0b0b1f9faa4df16205dec

$ podman image ls
REPOSITORY                         TAG         IMAGE ID      CREATED       SIZE
jp.icr.io/multi-arch/buildah-test  1.0         0bc3e2b24ac7  27 hours ago  5.86 MB

$ podman image inspect 0bc3e2b24ac7
[
     {
          "Id": "0bc3e2b24ac7e76f1fa58f4ad60d41ec596f4188dbe0b0b1f9faa4df16205dec",
          "Digest": "sha256:92251cd314782a2ef92a73b8ac8c9f2462337f6004a87ef9bd92ff9adad7f067",
          "RepoTags": [
               "jp.icr.io/multi-arch/buildah-test:1.0"
          ],
          "RepoDigests": [
               "jp.icr.io/multi-arch/buildah-test@sha256:387922dcf0e66c7c611e913db52eb5e1545b80105824b8d0d2894837d6312001",
               "jp.icr.io/multi-arch/buildah-test@sha256:92251cd314782a2ef92a73b8ac8c9f2462337f6004a87ef9bd92ff9adad7f067"
          ],
          "Parent": "",
          "Comment": "",
          "Created": "2022-07-05T06:04:30.8304086Z",
          "Config": {
               "Env": [
                    "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
               ],
               "Entrypoint": [
                    "/usr/bin/start.sh"
               ],
               "Labels": {
                    "io.buildah.version": "1.24.2"
               }
          },
          "Version": "",
          "Author": "",
          "Architecture": "amd64",
          "Os": "linux",
          "Size": 5863548,
          "VirtualSize": 5863548,
          "GraphDriver": {
               "Name": "overlay",
               "Data": {
                    "LowerDir": "/var/lib/containers/storage/overlay/4fc242d58285699eca05db3cc7c7122a2b8e014d9481f323bd9277baacfa0628/diff",
                    "UpperDir": "/var/lib/containers/storage/overlay/03a764c09dcd6d27dcd7e4df2f836c49654df70a82873923a63d717d0a1afc87/diff",
                    "WorkDir": "/var/lib/containers/storage/overlay/03a764c09dcd6d27dcd7e4df2f836c49654df70a82873923a63d717d0a1afc87/work"
               }
          },
          "RootFS": {
               "Type": "layers",
               "Layers": [
                    "sha256:4fc242d58285699eca05db3cc7c7122a2b8e014d9481f323bd9277baacfa0628",
                    "sha256:1856f948c4bf972825d5ebc9ddbb3d6ccbd2c1d2a890bbf1cda21cfd13803116"
               ]
          },
          "Labels": {
               "io.buildah.version": "1.24.2"
          },
          "Annotations": {
               "org.opencontainers.image.base.digest": "sha256:a777c9c66ba177ccfea23f2a216ff6721e78a662cd17019488c417135299cd89",
               "org.opencontainers.image.base.name": "docker.io/library/alpine:3.15"
          },
          "ManifestType": "application/vnd.oci.image.manifest.v1+json",
          "User": "",
          "History": [
               {
                    "created": "2022-04-05T00:19:59.790636867Z",
                    "created_by": "/bin/sh -c #(nop) ADD file:5d673d25da3a14ce1f6cf66e4c7fd4f4b85a3759a9d93efb3fd9ff852b5b56e4 in / "
               },
               {
                    "created": "2022-04-05T00:19:59.912662499Z",
                    "created_by": "/bin/sh -c #(nop)  CMD [\"/bin/sh\"]",
                    "empty_layer": true
               },
               {
                    "created": "2022-07-05T06:04:30.400728016Z",
                    "created_by": "/bin/sh -c #(nop) ADD file:29224fab6275fcbcfeb9e59d018598d1ced47483889d97bc4ed12e8a41c8184f in /usr/bin ",
                    "empty_layer": true
               },
               {
                    "created": "2022-07-05T06:04:30.829747547Z",
                    "created_by": "/bin/sh -c chmod a+x /usr/bin/start.sh",
                    "empty_layer": true
               },
               {
                    "created": "2022-07-05T06:04:31.000808315Z",
                    "created_by": "/bin/sh -c #(nop) ENTRYPOINT [\"/usr/bin/start.sh\"]",
                    "comment": "FROM docker.io/library/alpine:3.15"
               }
          ],
          "NamesHistory": [
               "jp.icr.io/multi-arch/buildah-test:1.0"
          ]
     }
]
$ podman run --rm -ti jp.icr.io/multi-arch/buildah-test:1.0
[Wed Jul  6 08:42:48 UTC 2022] : start.sh is running ...
[Wed Jul  6 08:42:58 UTC 2022] : start.sh is running ...
^C$

このように、buildah manifest push --all コマンドで IBM Cloud Container Registry (ICR) に Multi-Architecture Image を push することができます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?