docker hub:解释层以了解已安装的内容

docker hub: interpreting layers to understand what is already installed

我最近开始经常使用 docker。我通常从 dockerhub 中拉取一个镜像或者基于 dockerhub 镜像编写一个 Dockerfile。

有没有办法知道图像中已经有什么(显然不需要拉取图像),比如 OS 它是基于什么构建的,如果 python,安装了 pip,如果一些 python 是否安装了像 NumPy 这样的库?

例如:这张图片https://hub.docker.com/layers/tensorflow/tensorflow/2.6.0rc0-gpu

从标签上,我知道它有支持cuda (gpu) 的tensorflow。但没有提供其他信息。

我最近想通了,我可以点击每一层,查看实际代码。但实际上需要深入挖掘才能找到更多细节。

例如:我看到一些apt命令,弄清楚它是基于debian/ubuntu OS。或者,在从图像中读取 python3-pip 关键字后,我意识到 pip 已安装。

代码可读性不是很好(至少对我而言)。有没有更好的方法来确定图像中已有的内容以避免在 Dockerfile 中进行冗余安装?

你总能找到你感兴趣的镜像的dockerfile,比如你可以找到所有层,比如image python:3.9 here

或者您可以使用docker history查看一张图片的所有图层。

Docker(出色地)使用以前的层进行新构建,这也是与虚拟机的主要区别。例如,您可以拉取 python 图像:

docker pull python:3.6

快速浏览 docker image ls 可用的图像,您可以找到这样的图像 ID

python 3.6 5fad76530472 7 days ago 875MB

然后创建一个新的dockerfile:

FROM python:3.6
ENTRYPOINT ["echo", "something"]

图像 python 已在 /var/lib/docker/overlay2 下载,因此当您使用 docker build -f dockerfile . 运行 时,您可以看到:

Sending build context to Docker daemon     47MB
Step 1/2 : FROM python:3.6
 ---> 5fad76530472
Step 2/2 : ENTRYPOINT ["echo", "test"]
 ---> Running in b7034642a88d
Removing intermediate container b7034642a88d
 ---> 0a6f3dc9d10a
Successfully built 0a6f3dc9d10a

Python的图像id完全相同,这意味着Docker不会从头开始一切,而是重复使用已经可用的图像。

如果您转到目录 /var/lib/docker/overlay2,并且 运行

$ du -sh -m overlay2
1087 overlay2

这意味着数据的总大小约为 1087 MB,但如果您 运行 docker image ls 并总结所有图像的总大小,它会更大!我们可以说存在某种用于存储 Docker 图像的智能机制,我们不能简单地暗示所有 Docker 图像的大小都等于检索实际存储大小。

希望这部分解决了您对 Docker 文件中的冗余图像的担忧。