我有一个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。这可能吗?
感谢。
答案 0 :(得分:13)
我想你可以通过docker export CONTAINER_ID
或docker 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)
答案 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
进程并排运行也是可以的。