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

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

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

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

谢谢你!

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


当前回答

我已经通过使用Docker网站上的搜索功能解决了这个问题,其中“*”是一个有效的搜索,返回200k个存储库,然后我爬取每个单独的页面。HTML解析允许我提取每个页面上的所有图像名称。

其他回答

要找到一个图像的所有层,并找到一个层的大小,你可以通过“manifest”实验特性从docker hub注册表中显示清单:

docker manifest inspect ubuntu

结果是一个JSON文件(这里只显示了第一行):

{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
   "manifests": [
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 529,
         "digest": "sha256:10cbddb6cf8568f56584ccb6c866203e68ab8e621bb87038e254f6f27f955bbe",
         "platform": {
            "architecture": "amd64",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 529,
         "digest": "sha256:dd375524d7eda25a69f9f9790cd3e28855be7908e04162360dd462794035ebf7",
         "platform": {
            "architecture": "arm",
            "os": "linux",
            "variant": "v7"

https://hub.docker.com/search?q=*显示了整个Docker中心中的所有图像,这是不可能通过搜索命令得到的,因为它不接受通配符。 从v1.10开始,你可以通过拖动图像并使用以下命令来找到图像中的所有图层: Docker拉ubuntu ID=$(sudo docker inspect -f{{。Id}} ubuntu) 金桥.rootfs。diff_ids /var/lib/docker/image/aufs/imagedb/content/$(echo $ID|tr ':' '/')

3)大小可以在/var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/size中找到,尽管LAYERID !=前面命令中找到的diff_ids。为此,您需要查看/var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/diff,并与前面的命令输出进行比较,以正确匹配正确的diff_id和大小。

我已经通过使用Docker网站上的搜索功能解决了这个问题,其中“*”是一个有效的搜索,返回200k个存储库,然后我爬取每个单独的页面。HTML解析允许我提取每个页面上的所有图像名称。

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

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

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

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

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

在我看来,docker history <image>就足够了。返回每个图层的大小:

$ docker history jenkinsci-jnlp-slave:2019-1-9c
IMAGE        CREATED    CREATED BY                                    SIZE  COMMENT
93f48953d298 42 min ago /bin/sh -c #(nop)  USER jenkins               0B
6305b07d4650 42 min ago /bin/sh -c chown jenkins:jenkins -R /home/je… 1.45GB