find每个Docker镜像的图层和图层大小

为了研究的目的,我试图抓取公共Dockerregistry( https://registry.hub.docker.com/ ),并找出1)平均图像有多less层,2)这些层的大小得到分配的想法。

不过,我研究了API和公共库以及github上的细节,但我无法find任何方法来:

  • 检索所有的公共库/图像(即使这些是数千我仍然需要一个起始列表来遍历)
  • find图像的所有图层
  • find一个层的大小(所以不是一个图像,但个别层)。

任何人都可以帮助我find一种方法来检索这些信息?

谢谢!

编辑:任何人都可以validation在Dockerregistry中search'*'是返回所有的存储库,而不是任何地方提到'*'的任何地方? https://registry.hub.docker.com/search?q=*

您可以在/ var / lib / docker / aufs / layers文件夹中find图像的图层; 提供是否将存储驱动程序configuration为aufs(默认选项)

例:

  docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0ca502fa6aae ubuntu "/bin/bash" 44 minutes ago Exited (0) 44 seconds ago DockerTest 

现在查看使用图像“Ubuntu”创build的容器层; 进入/ var / lib / docker / aufs / layers目录,cat文件以容器ID开始(这里是0ca502fa6aae *)

  root@viswesn-vm2:/var/lib/docker/aufs/layers# cat 0ca502fa6aaefc89f690736609b54b2f0fdebfe8452902ca383020e3b0d266f9-init d2a0ecffe6fa4ef3de9646a75cc629bbd9da7eead7f767cb810f9808d6b3ecb6 29460ac934423a55802fcad24856827050697b4a9f33550bd93c82762fb6db8f b670fb0c7ecd3d2c401fbfd1fa4d7a872fbada0a4b8c2516d0be18911c6b25d6 83e4dde6b9cfddf46b75a07ec8d65ad87a748b98cf27de7d5b3298c1f3455ae4 

这将通过运行显示相同的结果

 root@viswesn-vm2:/var/lib/docker/aufs/layers# docker history ubuntu IMAGE CREATED CREATED BY SIZE COMMENT d2a0ecffe6fa 13 days ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B 29460ac93442 13 days ago /bin/sh -c sed -i 's/^#\s*\ (deb.*universe\)$/ 1.895 kB b670fb0c7ecd 13 days ago /bin/sh -c echo '#!/bin/sh' > /usr/sbin/polic 194.5 kB 83e4dde6b9cf 13 days ago /bin/sh -c #(nop) ADD file:c8f078961a543cdefa 188.2 MB 

查看完整的图层ID; 使用–no-trunc选项作为history命令的一部分运行。

 docker history --no-trunc ubuntu 

有一个非常好的答案在这里: https : //stackoverflow.com/a/32455275/165865

在图像下方运行:

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

一个更多的工具: https : //github.com/CenturyLinkLabs/dockerfile-from-image

使用ImageLayers.io的GUI

解决:我看到这个线程仍然是活跃的,所以我会更新任何有类似问题的人。

1) https://hub.docker.com/search?q=*显示了整个Docker集线器中的所有镜像,不可能通过search命令获取,因为它不接受通配符。

2)从v1.10开始,您可以通过拉取图像并使用以下命令来查找图像中的所有图层:

 docker pull ubuntu ID=$(sudo docker inspect -f {{.Id}} ubuntu) jq .rootfs.diff_ids /var/lib/docker/image/aufs/imagedb/content/$(echo $ID|tr ':' '/') 

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

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