TIPS之 Docker Image 在多个register中同步多架构镜像(multi arch images)

Docker Image 在多个register中同步多架构镜像(multi arch images)

Posted by 董江 on Thursday, March 23, 2023

1.多架构镜像 制作

这部分请参考:Docker Buildx 构建多系统镜像

2.多架构镜像 copy、sync和管理

2.1多架构场景下有多出了 manifests 和 manifests list

manifests 是镜像的描述清单,是在镜像的上层的又一种抽象,这个清单文件中也包含了有关于镜像的信息,如 layer层大小摘要信息。 而 manifests list 就是在这个描述清单中有多种类型的 manifest 镜像描述信息,这个描述清单列表可以通过镜像 TAG 关联访问。

单架构manifest描述:

dongjiang@MacBook Pro:operator $ docker manifest inspect dongjiang1989/prometheus-operator:v0.60.3
{
	"schemaVersion": 2,
	"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
	"config": {
		"mediaType": "application/vnd.docker.container.image.v1+json",
		"size": 1770,
		"digest": "sha256:5bcd0adc097560d0ffd8a7b55c82cad2d0e9e86a4546bae88f64730ea0cdbe85"
	},
	"layers": [
		{
			"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
			"size": 777659,
			"digest": "sha256:9b231b23b5cdc7c22cc3c519df0e35876200ecd02e69978ab7dfc2fad43b384e"
		},
		{
			"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
			"size": 487118,
			"digest": "sha256:a1e445c9ea057d36599d14854b3d9b1be3087dd76916eab071f221c15147d66f"
		},
		{
			"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
			"size": 30314085,
			"digest": "sha256:6a771c3ba9618f4ecfd9f8939169765745a2b90786e0236d5d61a8813c36e88e"
		}
	]
}

多架构manifest描述: 带有platform平台属性

dongjiang@MacBook Pro:operator $ docker manifest inspect dongjiang1989/metrics-server:v0.6.3
{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
   "manifests": [
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 2403,
         "digest": "sha256:3e7fce61907e003ef8734cc6a39195228002d9b2d64c3fe3b7593f9d448ea133",
         "platform": {
            "architecture": "amd64",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 2403,
         "digest": "sha256:8ca8f4522045842eaf6961abc4c407954f6e471ee5f9e0ac6100198e02356626",
         "platform": {
            "architecture": "arm",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 2403,
         "digest": "sha256:2179355e2afe28c116b00e9b8e5c694753f6d1bb2538e17f5d6ad4cca39483f8",
         "platform": {
            "architecture": "arm64",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 2403,
         "digest": "sha256:6254c547b8da009366311b14d3339c45e84685ad1b6dfa09720212c2959efafa",
         "platform": {
            "architecture": "ppc64le",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 2403,
         "digest": "sha256:367d5a89b1d85fb98ded44618c17adb9e9655e69bed66608f8069f8ac8bf7cf2",
         "platform": {
            "architecture": "s390x",
            "os": "linux"
         }
      }
   ]
}

2.2场景

skopeo

很多场景下,需要将image重一个源搬移到另一个源,一个源搬移到本地目录; 并且这些image是多架构的情况下,如何将所有架构image全部搬移,是一个常见单比较困难的事情

2.2.1镜像搬运工 skopeo

skopeo 是一个命令行工具,用于对容器镜像镜像库执行各种操作,支持使用 OCI 镜像与原始的 Docker v2 镜像。 可对容器镜像和容器存储进行操作。 在没有dockerd的环境下,使用 skopeo 操作镜像是非常方便的。Skopeo 能够在容器注册表上检查存储库并获取图片层。 Inspect 命令获取存储库的清单,它能够向您显示关于整个存储库或标记的类似 docker inspect 的 json 输出。与 docker inspect 不同,这个工具可以帮助您在拉取存储库或标记之前(使用磁盘空间)收集有用的信息。Inspect 命令可以显示给定存储库可用的标记、图像的标签、图像的创建日期和操作系统等等。

2.3如何安装/使用

MacOS 安装:

$ brew install skopeo

Linux或者其他设备上使用:(以容器方式运行

$ docker run --net=host quay.io/skopeo/stable:latest [commond]

其中 --net=host 是为了可以用上host dns的域名解析; commond 就是具体的 skopeo 指令集合

2.4两个源之间同步单个镜像

举个例子: 将quay.ioskopeo/stable:latest镜像,所有多架构镜像,都同步到dockerhub中的dongjiang1989/skopeo:latest

$ docker run --net=host quay.io/skopeo/stable:latest copy --debug --multi-arch all --dest-username ***** --dest-password *****  docker://quay.io/skopeo/stable:latest docker://docker.io/dongjiang1989/skopeo:latest

3.其他: skopeo 容器镜像工具使用

3.1skopeo支持类型

Skopeo 支持的镜像仓库类型:

  • containers-storage
  • dir
  • docker://docker:Docker Registry HTTP API V2
  • docker-archive:path[:docker-reference]:docker save 打包的镜像
  • docker-daemon:docker-reference:本地的 docker 镜像
  • oci:path:tag

支持的镜像格式:

  • dir:/PATH
  • docker://k8s.gcr.io/pause:3.2
  • docker-daemon:alpine:latest
  • docker-archive:alpine.tar
  • oci:oci:alpine:latest

3.2镜像信息

dongjiang@MacBook Pro:k8s $ docker run quay.io/skopeo/stable:latest inspect docker://docker.io/dongjiang1989/skopeo:latest 
{
    "Name": "docker.io/dongjiang1989/skopeo",
    "Digest": "sha256:8c16f1714a5b81408e0cbfdd2b09e86a925eb80408e49c4b60a98175cff1d287",
    "RepoTags": [
        "latest"
    ],
    "Created": "2023-03-22T22:54:15.363694893Z",
    "DockerVersion": "",
    "Labels": {
        "io.buildah.version": "1.29.1",
        "license": "MIT",
        "name": "fedora",
        "org.opencontainers.image.created": "2023-03-22T22:23:09+00:00",
        "org.opencontainers.image.revision": "b43ec279d2dc5deec07e7e9824a9e568dc068357",
        "org.opencontainers.image.source": "https://github.com/containers/skopeo.git",
        "org.opencontainers.image.version": "1.11.1",
        "vendor": "Fedora Project",
        "version": "37"
    },
    "Architecture": "arm64",
    "Os": "linux",
    "Layers": [
        "sha256:753dd75b50994c9094ec429728f9ec15e1a8565b605b0b5128a4016c400b3d6a",
        "sha256:670aa3005329891a7f4cb501bce4eeca8bd755441666815bbb97656871a00f2e",
        "sha256:c3c8d4d507f2913cf890da57dd1bf1ac03ff7ef6bb4925ed55254adbbc5afe46",
        "sha256:0da5822bda67ddcc31e093c4b5f04e82cf06d48cb975469a034341c1461951a9",
        "sha256:b6697933df6d864ba840a5c9748d789795ec76f1943133f9f28a6a02f82f65a2"
    ],
    "LayersData": [
        {
            "MIMEType": "application/vnd.oci.image.layer.v1.tar+gzip",
            "Digest": "sha256:753dd75b50994c9094ec429728f9ec15e1a8565b605b0b5128a4016c400b3d6a",
            "Size": 68882505,
            "Annotations": null
        },
        {
            "MIMEType": "application/vnd.oci.image.layer.v1.tar+gzip",
            "Digest": "sha256:670aa3005329891a7f4cb501bce4eeca8bd755441666815bbb97656871a00f2e",
            "Size": 22375091,
            "Annotations": null
        },
        {
            "MIMEType": "application/vnd.oci.image.layer.v1.tar+gzip",
            "Digest": "sha256:c3c8d4d507f2913cf890da57dd1bf1ac03ff7ef6bb4925ed55254adbbc5afe46",
            "Size": 1847,
            "Annotations": null
        },
        {
            "MIMEType": "application/vnd.oci.image.layer.v1.tar+gzip",
            "Digest": "sha256:0da5822bda67ddcc31e093c4b5f04e82cf06d48cb975469a034341c1461951a9",
            "Size": 4003,
            "Annotations": null
        },
        {
            "MIMEType": "application/vnd.oci.image.layer.v1.tar+gzip",
            "Digest": "sha256:b6697933df6d864ba840a5c9748d789795ec76f1943133f9f28a6a02f82f65a2",
            "Size": 227,
            "Annotations": null
        }
    ],
    "Env": [
        "DISTTAG=f37container",
        "FGC=f37",
        "container=oci",
        "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
        "REGISTRY_AUTH_FILE=/tmp/auth.json"
    ]
}

其他能力

复制镜像

$ skopeo copy docker://quay.io/buildah/stable docker://registry.internal.company.com/buildah
$ skopeo copy oci:busybox_ocilayout:latest dir:existingemptydirectory
$ skopeo copy docker://ubuntu:20.04 dir:/root/ubuntu-20.04
$ skopeo copy docker://k8s.gcr.io/pause:3.2 docker://docker.io/gcmirrors/pause:3.2 --dest-authfile /root/.docker/config.json

删除镜像

$ skopeo delete docker://localhost:5000/imagename:latest

同步仓库

$ skopeo login --username USER myregistrydomain.com:5000
$ skopeo inspect --creds=testuser:testpassword docker://myregistrydomain.com:5000/busybox
$ skopeo copy --src-creds=testuser:testpassword docker://myregistrydomain.com:5000/private oci:local_oci_image
$ skopeo logout ...

「如果这篇文章对你有用,请随意打赏」

Kubeservice博客

如果这篇文章对你有用,请随意打赏

使用微信扫描二维码完成支付