如何检查Docker镜像中包含什么内容?

4
在寻找适合项目的最佳镜像时,您遍历了Docker Hub并遇到了许多镜像。根据它们提供的内容,您可以在“slim”,“alpine”,“buster”,版本化镜像,“latest”镜像等之间进行选择。
如何查看图像内部的内容(有哪些层次结构)?是否可以列出镜像中包含的库和驱动程序?我该如何确保我的Redis镜像具有与Django配合工作所需的正确驱动程序和库?如何查看图像是否使用apt,apt-get,apk进行软件包管理,或者是否没有提供这种实用程序?
此外,如果可能的话,我想在从Hub获取镜像之前先检查一下。启动docker run -it [...]是进行此类检查的一种方法,但如果需要预先下载> 1GB的镜像,则效率不高。

3
为什么不检查Dockerfile呢? - Smutje
看最新的MariaDB Dockerfile,我们可以看到它使用了apt-get,安装了pwgentzdataxz-utils,但是我怎么知道它是否也安装了那些Django驱动程序呢?也许它隐含地写在某个地方,但我不知道如何找到它。 - AbreQueVoy
1
你为什么认为它有那些驱动程序,如果它们没有包含在 Dockerfile 中呢? - Smutje
当我安装了我能找到的最大的镜像时,它包含了所有必要的库和驱动程序:我在进入运行容器后检查了一下。这种方法的缺点是你必须下载一个镜像,最大的镜像可能不适合你的用例,并且你必须假设库和驱动程序已经存在:没有在 Dockerfile 中明确列出。 - AbreQueVoy
1个回答

6

可以使用该镜像运行一个交互式 shell 容器,并查看镜像内容。

docker run -it image_name sh

一旦构建完成,您可以运行以下命令查看构成该镜像的所有层:

docker history <image_id>

要了解每个层中有哪些内容,您需要在 Docker 主机上查看层,位于 /var/lib/docker/aufs AUFS (另一种联合文件系统)

/var/lib/docker/aufs 指向 diff, mnt, layers 目录。

  1. 图像层及其内容存储在 diff 目录中。
  2. 正在运行的容器挂载在 mnt 目录下 (有关挂载的更多说明见下文)。
  3. 图像层的堆叠方式在 layers 目录中指定。

可以使用工具 dive 来探索 Docker 镜像、层内容等。


谢谢您的回答。在从Hub或其他来源下载图像之前,是否还有一种检查图像内容的方法呢? - AbreQueVoy
可以确认,Dive 是一个无价的小宝藏。 - johnniepop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接