1、docker manifest 简介
docker manifest
是用于管理 Docker 多平台镜像。它可以帮助我们创建、查看和删除多架构镜像,以便在多种操作系统和 CPU 架构上运行 Docker 镜像。
docker manifest
命令本身不会执行任何操作。为了对清单或清单列表进行操作,必须使用其中一个子命令。
manifest是关于镜像的信息,如layers、大小和摘要。docker manifest
命令还为用户提供了额外的信息,例如构建镜像的操作系统和体系结构。
manifest列表是通过指定一个或多个(理想情况下是多个)镜像名称来创建的镜像层的列表。然后,它可以像docker pull和docker run命令中的镜像名称一样使用。
理想情况下,多平台镜像清单(manifest list)应该由在不同操作系统和 CPU 架构上功能相同的镜像组成。因此,多平台镜像清单通常被称为“多架构镜像”。但是,用户也可以创建一个指向两个不同镜像的清单,例如一个适用于 Windows on AMD64 平台,另一个适用于 Darwin on AMD64 平台的清单。虽然这可能不是多平台镜像清单的理想用例,但在某些需要管理多个镜像跨越多个平台的情况下仍然很有用。总的来说,建议只将具有相同功能和架构的镜像包含在一个多平台镜像清单中,以确保一致性并避免镜像不匹配带来的潜在问题。但是,多平台镜像清单的灵活性使得用户可以根据自己的特定需求进行创建。
参考文档:https://docs.docker.com/engine/reference/commandline/manifest/
2、docker manifest 语法
docker manifest COMMAND COMMAND
1)manifest inspect
docker manifest inspect --help Usage: docker manifest inspect [OPTIONS] [MANIFEST_LIST] MANIFEST Display an image manifest, or manifest list Options: --help Print usage --insecure Allow communication with an insecure registry -v, --verbose Output additional info including layers and platform
2)manifest create
Usage: docker manifest create MANIFEST_LIST MANIFEST [MANIFEST...] Create a local manifest list for annotating and pushing to a registry Options: -a, --amend Amend an existing manifest list --insecure Allow communication with an insecure registry --help Print usage
3)manifest annotate
Usage: docker manifest annotate [OPTIONS] MANIFEST_LIST MANIFEST Add additional information to a local image manifest Options: --arch string Set architecture --help Print usage --os string Set operating system --os-version string Set operating system version --os-features stringSlice Set operating system feature --variant string Set architecture variant
4)manifest push
Usage: docker manifest push [OPTIONS] MANIFEST_LIST Push a manifest list to a repository Options: --help Print usage --insecure Allow push to an insecure registry -p, --purge Remove the local manifest list after push
5)使用不安全的仓库
manifest 命令与仓库进行交互,因此它没有办法查询引擎的允许列表中是否包含不安全的仓库。为了让 CLI 与不安全的仓库进行交互,一些 docker manifest
命令具有 --insecure
标志。对于每个事务(例如创建),如果涉及对仓库的查询,则必须指定 --insecure
标志。该标志告诉 CLI 此仓库调用可能会忽略像缺少或自签名证书等安全问题。同样,在将清单推送到不安全的仓库时,必须指定 --insecure
标志。如果在不使用不安全的仓库时没有使用此标志,则 manifest
命令无法找到满足默认要求的仓库,从而无法执行操作。
3、docker manifest 命令
1)检查镜像的manifest对象
docker manifest inspect hello-world { "schemaVersion": 2, "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "config": { "mediaType": "application/vnd.docker.container.image.v1+json", "size": 1520, "digest": "sha256:1815c82652c03bfd8644afda26fb184f2ed891d921b20a0703b46768f9755c57" }, "layers": [ { "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "size": 972, "digest": "sha256:b04784fba78d739b526e27edc02a5a8cd07b1052e9283f5fc155828f4b614c28" } ] }
2)检查镜像的manifest并获取os/arch信息
docker manifest inspect --verbose hello-world { "Ref": "docker.io/library/hello-world:latest", "Digest": "sha256:f3b3b28a45160805bb16542c9531888519430e9e6d6ffc09d72261b0d26ff74f", "SchemaV2Manifest": { "schemaVersion": 2, "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "config": { "mediaType": "application/vnd.docker.container.image.v1+json", "size": 1520, "digest": "sha256:1815c82652c03bfd8644afda26fb184f2ed891d921b20a0703b46768f9755c57" }, "layers": [ { "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "size": 972, "digest": "sha256:b04784fba78d739b526e27edc02a5a8cd07b1052e9283f5fc155828f4b614c28" } ] }, "Platform": { "architecture": "amd64", "os": "linux" } }
3)创建并推送一个manifest列表
要创建一个多平台镜像清单,首先需要在本地创建一个清单,并指定要包含在其中的镜像。请注意,此清单将被推送到一个仓库中,因此如果您想将其推送到除 docker 仓库之外的其他仓库,则需使用该仓库的名称或 IP 和端口号来创建清单。这类似于给镜像打标签并将其推送到外部仓库。
创建本地多平台镜像清单后,您还可以选择对其进行注释。可以添加的注释项包括架构和操作系统(覆盖镜像的当前值)、操作系统特性和架构变体。
最后,您需要将多平台镜像清单推送到所需的仓库中。下面是这三个命令的描述以及将它们组合在一起的示例。
docker manifest create 45.55.81.106:5000/coolapp:v1 \ 45.55.81.106:5000/coolapp-ppc64le-linux:v1 \ 45.55.81.106:5000/coolapp-arm-linux:v1 \ 45.55.81.106:5000/coolapp-amd64-linux:v1 \ 45.55.81.106:5000/coolapp-amd64-windows:v1 Created manifest list 45.55.81.106:5000/coolapp:v1
docker manifest annotate 45.55.81.106:5000/coolapp:v1 45.55.81.106:5000/coolapp-arm-linux --arch arm
docker manifest push 45.55.81.106:5000/coolapp:v1 Pushed manifest 45.55.81.106:5000/coolapp@sha256:9701edc932223a66e49dd6c894a11db8c2cf4eccd1414f1ec105a623bf16b426 with digest: sha256:f67dcc5fc786f04f0743abfe0ee5dae9bd8caf8efa6c8144f7f2a43889dc513b Pushed manifest 45.55.81.106:5000/coolapp@sha256:f3b3b28a45160805bb16542c9531888519430e9e6d6ffc09d72261b0d26ff74f with digest: sha256:b64ca0b60356a30971f098c92200b1271257f100a55b351e6bbe985638352f3a Pushed manifest 45.55.81.106:5000/coolapp@sha256:39dc41c658cf25f33681a41310372f02728925a54aac3598310bfb1770615fc9 with digest: sha256:df436846483aff62bad830b730a0d3b77731bcf98ba5e470a8bbb8e9e346e4e8 Pushed manifest 45.55.81.106:5000/coolapp@sha256:f91b1145cd4ac800b28122313ae9e88ac340bb3f1e3a4cd3e59a3648650f3275 with digest: sha256:5bb8e50aa2edd408bdf3ddf61efb7338ff34a07b762992c9432f1c02fc0e5e62 sha256:050b213d49d7673ba35014f21454c573dcbec75254a08f4a7c34f66a47c06aba
4)检查manifest列表
docker manifest inspect coolapp:v1 { "schemaVersion": 2, "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json", "manifests": [ { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 424, "digest": "sha256:f67dcc5fc786f04f0743abfe0ee5dae9bd8caf8efa6c8144f7f2a43889dc513b", "platform": { "architecture": "arm", "os": "linux" } }, { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 424, "digest": "sha256:b64ca0b60356a30971f098c92200b1271257f100a55b351e6bbe985638352f3a", "platform": { "architecture": "amd64", "os": "linux" } }, { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 425, "digest": "sha256:df436846483aff62bad830b730a0d3b77731bcf98ba5e470a8bbb8e9e346e4e8", "platform": { "architecture": "ppc64le", "os": "linux" } }, { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 425, "digest": "sha256:5bb8e50aa2edd408bdf3ddf61efb7338ff34a07b762992c9432f1c02fc0e5e62", "platform": { "architecture": "s390x", "os": "linux" } } ] }
5)推送到不安全的仓库
docker manifest create --insecure myprivateregistry.mycompany.com/repo/image:1.0 \ myprivateregistry.mycompany.com/repo/image-linux-ppc64le:1.0 \ myprivateregistry.mycompany.com/repo/image-linux-s390x:1.0 \ myprivateregistry.mycompany.com/repo/image-linux-arm:1.0 \ myprivateregistry.mycompany.com/repo/image-linux-armhf:1.0 \ myprivateregistry.mycompany.com/repo/image-windows-amd64:1.0 \ myprivateregistry.mycompany.com/repo/image-linux-amd64:1.0 docker manifest push --insecure myprivateregistry.mycompany.com/repo/image:tag
注意:在对多平台镜像清单进行注释时,不需要使用 --insecure
标志,因为注释是针对本地存储的清单副本。如果您在对本地存储的多平台镜像清单执行 docker manifest inspect
命令时,同样也可以跳过 --insecure
标志。请注意,本地存储的多平台镜像清单永远不会被引擎用于 docker pull
操作。
4、子命令
命令 | 描述 |
docker manifest annotate | 向本地镜像清单添加额外信息进行注释 |
docker manifest create | 创建本地镜像清单以用于注释并推送到仓库 |
docker manifest inspect | 显示镜像清单或多平台镜像清单 |
docker manifest push | 将多平台镜像清单推送到仓库 |
docker manifest rm | 从本地存储中删除一个或多个镜像清单 |