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 文件中的冗余图像的担忧。
我最近开始经常使用 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 文件中的冗余图像的担忧。