我正在尝试使用 python 为 docker 注册表编写一个 Web ui。我主要这样做,所以我可以学到很多关于 docker 的知识,并且我想拥有自己的 Web ui。
我想显示每个图像的未压缩大小。据我所知,应该可以通过获取特定标签的清单来实现。我正在使用来自 docker hub 的官方 docker 注册表以及最新的标签。
如果我制作一个
GET http://docker.lan:5000/v2/my-image/manifests/latest
,我会得到清单,但只有 schemaVersion 1,如果我没看错的话,它已被废弃。
{
"schemaVersion": 1,
"name": "my-image",
"tag": "latest",
"architecture": "amd64",
"fsLayers": [
{
"blobSum": "sha256:a3ed95caeb02ffe68cdd9fd84506680ae93d633cb16422d00e8a7c22955b46d4"
},...
如何获取 schemaVersion 2?看来,还有更多细节。我还尝试获取每个斑点并将每个大小添加到一个整数,但这只是压缩的大小,我想显示未压缩的大小。
我尝试将 GET 的标头设置为
{"Content-Type": "application/vnd.docker.distribution.manifest.v2+json"}
或
{"Content-Type": "application/vnd.docker.distribution.manifest.list.v2+json"}
如文档媒体类型所示,但这没有任何作用,或者我用错了......
您缺少
Accept
标题。否则,注册表将回退到架构 v1。 Accept 标头应该是您可以接收的媒体类型列表,并且有 Docker 和 OCI 媒体类型:
客户端应该包含一个 Accept 标头,指示它支持哪些清单内容类型。在成功的响应中,Content-Type 标头将指示返回的清单的类型。 Content-Type 标头应该与客户端推送的清单内容类型相匹配。如果清单具有 mediaType 字段,客户端应该拒绝,除非 mediaType 字段的值与 Content-Type 标头指定的类型匹配。有关使用 Accept 标头和内容协商的更多信息,请参阅内容协商。
https://github.com/opencontainers/distribution-spec/blob/main/spec.md#pull
有关 Accept 标头的更多信息,请参阅 RFC:https://datatracker.ietf.org/doc/html/rfc7231#section-5.3.2