查找每个Docker镜像的图层和图层大小

时间:2015-04-17 10:26:12

标签: image docker web-crawler

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

然而,我研究了API和公共库以及github上的详细信息,但我找不到任何方法:

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

有人可以帮我找到检索此信息的方法吗?

谢谢!

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

11 个答案:

答案 0 :(得分:59)

您可以在/ var / lib / docker / aufs / layers文件夹中找到图像的图层;如果您将存储驱动程序配置为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&#34 ;;转到/ 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选项作为历史命令的一部分运行。

docker history --no-trunc ubuntu

答案 1 :(得分:18)

这是一篇关于Show Layers of Docker Image

的好文章

您可以先找到图片ID:

$ docker images -a

然后找到它的图层和尺寸:

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

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

$ docker -v
Docker version 1.13.1, build 092cba3

答案 2 :(得分:9)

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

只需在图片下方运行:

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

答案 3 :(得分:6)

这将检查泊坞窗图像并打印图层:

$ docker image inspect nginx -f '{{.RootFS.Layers}}'
[sha256:d626a8ad97a1f9c1f2c4db3814751ada64f60aed927764a3f994fcd88363b659 sha256:82b81d779f8352b20e52295afc6d0eab7e61c0ec7af96d85b8cda7800285d97d sha256:7ab428981537aa7d0c79bc1acbf208c71e57d9678f7deca4267cc03fba26b9c8]

答案 4 :(得分:6)

我认为docker history <image>就足够了。这将返回每个图层的大小。

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

令我惊讶的是,仅仅改变所有者就会造成巨大的麻烦。

答案 5 :(得分:2)

  1. https://hub.docker.com/search?q=*显示整个Docker集线器中的所有图像,由于它不接受通配符,因此无法通过搜索命令获取此图像。

  2. 从v1.10开始,你可以通过拉动它并使用这些命令找到图像中的所有图层:

    Command "/opt/anaconda3/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-5hogbswt/numpy/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-xrahrzqb-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-5hogbswt/numpy/
  3. 3)大小可以在docker pull ubuntu ID=$(sudo docker inspect -f {{.Id}} ubuntu) jq .rootfs.diff_ids /var/lib/docker/image/aufs/imagedb/content/$(echo $ID|tr ':' '/') 中找到,尽管LAYERID!=使用上一个命令找到的diff_ids。为此,您需要查看/var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/size并与之前的命令输出进行比较,以正确匹配正确的diff_id和大小。

答案 6 :(得分:2)

可以检出用golang写成的dive

很棒的工具。

您可以调整源代码,以便将显示的所有信息导出到json文件中。

答案 7 :(得分:2)

确实可以从Docker注册表服务器中查询清单或blob信息,而无需将映像拉至本地磁盘。

您可以参考Registry v2 API来获取图像清单。

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

注意,您必须处理不同的清单版本。对于v2,您可以直接获取layer的大小和blob的摘要。对于v1 manifest,您可以HEAD Blob下载网址以获取实际的图层大小。

有一个simple script用于处理将持续保持的上述情况。

答案 8 :(得分:1)

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

使用ImageLayers.io的GUI

答案 9 :(得分:0)

并非完全是原始问题,而是要找到所有图像的总和而不重复计算共享层,以下操作很有用(ubuntu 18):

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

答案 10 :(得分:-1)

我已经在Docker的网站上使用搜索功能解决了这个问题,其中&#39; *&#39;是一个有效的搜索,返回200k存储库,然后我抓取每个invididual页面。 HTML解析允许我提取每个页面上的所有图像名称。