出于研究目的,我试图抓取公共Docker注册表(https://registry.hub.docker.com/),并找出1)平均图像有多少层,2)这些层的大小,以了解分布情况。

然而,我研究了API和公共图书馆以及github上的细节,但我找不到任何方法:

检索所有公共存储库/图像(即使有数千个,我仍然需要一个开始列表来迭代) 找出图像的所有层 找到一个图层的大小(所以不是图像,而是单个图层)。

有人能帮我找到找回这些信息的方法吗?

谢谢你!

编辑:有人能验证在Docker注册表中搜索'*'是返回所有的存储库,而不仅仅是任何地方提到'*'的东西吗?https://registry.hub.docker.com/search?q= *


当前回答

从docker注册服务器上查询清单或blob信息,而无需将映像拉到本地磁盘,这确实是可行的。

您可以参考Registry v2 API来获取image的清单。

GET /v2/<name>/manifests/<reference>

注意,您必须处理不同的清单版本。对于v2,你可以直接得到图层的大小和blob的摘要。对于v1清单,您可以HEAD blob下载url以获得实际的层大小。

有一个简单的脚本用于处理将持续维护的上述情况。

其他回答

从docker注册服务器上查询清单或blob信息,而无需将映像拉到本地磁盘,这确实是可行的。

您可以参考Registry v2 API来获取image的清单。

GET /v2/<name>/manifests/<reference>

注意,您必须处理不同的清单版本。对于v2,你可以直接得到图层的大小和blob的摘要。对于v1清单,您可以HEAD blob下载url以获得实际的层大小。

有一个简单的脚本用于处理将持续维护的上述情况。

不完全是最初的问题,但要找到所有图像的总和而不重复计算共享层,下面是有用的(ubuntu 18):

sudo du -h -d1  /var/lib/docker/overlay2 | sort -h

他们给出了一个很好的答案: https://stackoverflow.com/a/32455275/165865

只需运行下面的图片:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nate/dockviz images -t

你可以先使用以下方法找到图像ID:

$ docker images -a

然后找到图像的图层和它们的大小:

$ docker history --no-trunc <Image ID>

注意:我使用的是Docker 1.13.1版本

$ docker -v
Docker version 1.13.1, build 092cba3

还有一个工具:https://github.com/CenturyLinkLabs/dockerfile-from-image

使用imagelayer .io的GUI