然而,我研究了API和公共库以及github上的细节,但我找不到任何方法来:
- 检索所有公共存储库/镜像(即使有成千上万个,我仍然需要一个起始列表来迭代) - 找到图像的所有层 - 找到层的大小(因此不是图像,而是单个层)。
有人能帮我找到检索此信息的方法吗?
编辑:有人能够验证在Docker注册表中搜索“*”是否返回所有存储库,而不仅仅是任何地方提到“*”的内容吗? https://registry.hub.docker.com/search?q=\*
看看使用golang编写的dive!
非常棒的工具!
您可以先使用以下方式查找图像 ID:
$ docker images -a
然后找到图像的图层以及它们的尺寸:
$ docker history --no-trunc <Image ID>
注意:我使用的是 Docker 版本 1.13.1
$ docker -v
Docker version 1.13.1, build 092cba3
如果您将存储驱动程序配置为aufs(默认选项),则可以在文件夹/var/lib/docker/aufs/layers中找到图像的层级结构。
示例:
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"镜像创建的容器层,请前往/var/lib/docker/aufs/layers目录并查看以容器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
docker history
命令将不会像在/var/lib/docker/aufs/layers
文件夹中显示的那样给出镜像层信息。阅读此处的更新。 - Ruifeng Madocker history
命令不再提供有关 Docker 主机上实际层磁盘存储信息的信息。请参阅此博客。 - Ruifeng Ma在我看来,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
这将检查Docker镜像并打印出其层次结构:
$ docker image inspect nginx -f '{{.RootFS.Layers}}'
[sha256:d626a8ad97a1f9c1f2c4db3814751ada64f60aed927764a3f994fcd88363b659 sha256:82b81d779f8352b20e52295afc6d0eab7e61c0ec7af96d85b8cda7800285d97d sha256:7ab428981537aa7d0c79bc1acbf208c71e57d9678f7deca4267cc03fba26b9c8]
这里有一个非常好的答案: https://dev59.com/w1wY5IYBdhLWcg3wlolg#32455275
只需运行下面的图像:
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nate/dockviz images -t
https://hub.docker.com/search?q=* shows all the images in the entire Docker hub, it's not possible to get this via the search command as it doesnt accept wildcards.
As of v1.10 you can find all the layers in an image by pulling it and using these commands:
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
找到,尽管 LAYERID != 之前命令中找到的 diff_ids。这时需要查看 /var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/diff
并将其与之前的命令输出进行比较,以正确匹配相应的 diff_id 和大小。
docker manifest inspect ubuntu
{
"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"
GET /v2/<name>/manifests/<reference>
还有一个工具:https://github.com/CenturyLinkLabs/dockerfile-from-image
使用ImageLayers.io的图形用户界面(GUI)