docker:如何显示2个图像之间的差异

时间:2014-01-18 05:13:25

标签: docker

我有一个Dockerfile,其中包含一系列执行“apt-get install”的RUN指令;例如,几行:

RUN apt-get install -y tree
RUN apt-get install -y git

执行“docker build”之后,如果我执行“docker images -a”,我会看到构建期间创建的所有base-child-child -....图像的列表。

我想查看执行“apt-get install -y git”行时安装的所有软件包的列表(包括可能已经安装的依赖软件包,除了git软件包) 。

注意:我相信“docker diff”命令显示容器与启动它的图像之间的差异。相反,我想要两个图像(相同谱系)之间的差异:“树”和“git”图像ID。这可能吗?

感谢。

8 个答案:

答案 0 :(得分:13)

我想你可以通过docker export CONTAINER_IDdocker save IMAGE_ID将这两个图像的文件系统发送到tarball(根据评论更新)

然后使用您喜欢的任何工具来区分文件系统 - Git,Rdiff等。

答案 1 :(得分:11)

每个RUN指令都会创建一个新容器,您可以使用docker diff <container>检查容器的更改内容。

因此,在构建dockerfile之后,运行docker ps -a以获取构建文件创建的容器列表。它应该看起来像:

CONTAINER ID  IMAGE        COMMAND               CREATED        STATUS ...
53d7dadafee7  f71e394eb0fc /bin/sh -c apt-get i  7 minutes ago  Exit 0 ...
...

现在,您可以执行docker diff 53d7dadafee7查看更改内容。

答案 2 :(得分:11)

看看:

https://github.com/GoogleCloudPlatform/container-diff

此工具可以区分本地或远程泊坞窗图像,并且可以在不需要安装泊坞窗的情况下执行此操作。它有文件和包级别&#34;不同&#34; (例如:apt,npm和pip),以便您可以更轻松地查看两个docker镜像之间已更改的包中的差异。

免责声明:我是该项目的撰稿人

答案 3 :(得分:6)

如果您知道容器ID或名称(甚至停止容器), 您可以快速转储文件列表。

$ docker export CONTAIN_ID_OR_NAME | tar tv
-rwxr-xr-x  0 0      0           0  2  6 21:22 .dockerenv
-rwxr-xr-x  0 0      0           0  2  6 21:22 .dockerinit
drwxr-xr-x  0 0      0           0 10 21 13:46 bin/
-rwxr-xr-x  0 0      0     1021112 10  8  2014 bin/bash
-rwxr-xr-x  0 0      0       31152 10 21  2013 bin/bunzip2
-rwxr-xr-x  0 0      0           0 10 21  2013 bin/bzcat link to bin/bunzip2
lrwxrwxrwx  0 0      0           0 10 21  2013 bin/bzcmp -> bzdiff
-rwxr-xr-x  0 0      0        2140 10 21  2013 bin/bzdiff
lrwxrwxrwx  0 0      0           0 10 21  2013 bin/bzegrep -> bzgrep
-rwxr-xr-x  0 0      0        4877 10 21  2013 bin/bzexe
......

然后您可以将列表保存到文件并比较列表文件。

如果您坚持使用图片ID或名称,您可以即时转储第一层的文件列表

$ docker save alpine |tar xO '*/layer.tar' | tar tv
drwxr-xr-x  0 0      0           0 12 27 06:32 bin/
lrwxrwxrwx  0 0      0           0 12 27 06:32 bin/ash -> /bin/busybox
lrwxrwxrwx  0 0      0           0 12 27 06:32 bin/base64 -> /bin/busybox
lrwxrwxrwx  0 0      0           0 12 27 06:32 bin/bbconfig -> /bin/busybox
-rwxr-xr-x  0 0      0      821408 10 27 01:15 bin/busybox

毕竟,我建议您启动容器然后停止它,然后您可以按照第一种方式获得合并文件列表。

2017/02/01:显示容器文件列表的最快方式,您可以自由输入其根目录来读取文件

# PID=$(docker inspect -f '{{.State.Pid}}' CONTAIN_ID_OR_NAME)
# cd /proc/$PID/root && ls -lF
drwxr-xr-x  0 0      0           0 12 27 06:32 bin/
lrwxrwxrwx  0 0      0           0 12 27 06:32 bin/ash -> /bin/busybox
lrwxrwxrwx  0 0      0           0 12 27 06:32 bin/base64 -> /bin/busybox
lrwxrwxrwx  0 0      0           0 12 27 06:32 bin/bbconfig -> /bin/busybox
-rwxr-xr-x  0 0      0      821408 10 27 01:15 bin/busybox

注意,如果您使用的是docker-machine,则首先需要输入它 docker-machine ssh然后sudo sh

现在你得到了两个容器的根目录,你可以使用diff直接比较它们。

答案 4 :(得分:5)

看看:

https://github.com/moul/docker-diff

他们列出了Mac的Brew安装说明,我假设它是一个Bash脚本,所以我认为它可以在其他* nix环境中工作。

答案 5 :(得分:1)

这个对我有用:

docker run -it e5cba87ecd29 bash -c 'find /path/to/files -type f | sort  | xargs -I{} sha512sum {}' > /tmp/dockerfiles.e5cba87ecd29.txt
docker run -it b1d19fe1a941 bash -c 'find /path/to/files -type f | sort  | xargs -I{} sha512sum {}' > /tmp/dockerfiles.b1d19fe1a941.txt
meld /tmp/dockerfiles*

其中e5cba87ecd29和b1d19fe1a941是我感兴趣的图像,而/ path / to / files是一个可能是“/”的目录。 它会列出所有文件,对其进行排序并为其添加哈希以防万一。而且meld突出了所有的差异。

答案 6 :(得分:1)

现在是2019年,我刚刚找到了一个有用的工具,该工具于2017年底发布。 https://opensource.googleblog.com/2017/11/container-diff-for-comparing-container-images.html

以下内容来自container-diff github页面:

container-diff diff <img1> <img2> --type=history  [History]
container-diff diff <img1> <img2> --type=file  [File System]
container-diff diff <img1> <img2> --type=size  [Size]
container-diff diff <img1> <img2> --type=rpm  [RPM]
container-diff diff <img1> <img2> --type=pip  [Pip]
container-diff diff <img1> <img2> --type=apt  [Apt]
container-diff diff <img1> <img2> --type=node  [Node]

您可以一次运行多个分析器:

container-diff diff <img1> <img2> --type=history --type=apt --type=node

答案 7 :(得分:0)

听起来像在这种情况下,您可能只需要查看两层之间的差异即可。如果是这样,dive对此非常棒;它使您可以检查每一层的文件系统,并可以按更改类型(未更改,添加,删除,修改)筛选文件。

如果您要检查两个不相关图像之间的差异,那么两个dive进程并排运行也是可以的。