docker工人:如何显示2张图片之间的差异

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

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

在执行“docker build”之后,如果执行“docker images -a”,我会看到构build过程中创build的所有base-child-child -….图像的列表。

我想看看执行“apt-get install -y git”这一行时所安装的所有软件包的列表(包括除git软件包外还可能安装的依赖软件包)。

注意:我相信“docker diff”命令会显示容器和启动它的图像之间的差异。 相反,我想在两个图像(相同的血统)之间的差异:“树”和“混帐”图像ID。 这可能吗?

谢谢。

我想你可以通过docker export CONTAINERIDdocker save IMAGEID两个图像的文件系统发送到tarballs(基于评论更新)

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

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

所以在构builddockerfile之后,运行docker docker ps -a来获取构build文件创build的容器列表。 它应该看起来像这样:

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

现在你可以做docker diff 53d7dadafee7看看有什么改变。

如果您知道容器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 

毕竟,我build议你启动容器,然后停止它,那么你可以得到一个合并的文件列表中描述的第一种方式。

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 sshinput,然后inputsudo sh

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

看一下:

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

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

看一下 :

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

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

免责声明:我是这个项目的贡献者