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

smdnsysy  于 2023-04-20  发布在  Docker
关注(0)|答案(9)|浏览(117)

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

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

在执行了“docker build”之后,如果我再执行“docker images -a”,我会看到在构建过程中创建的所有base-child-child-.... images的列表。
我想查看在执行“apt-get install -y git”行时安装的所有包的列表(包括可能已经安装的依赖包,除了git包)。
注意:我相信“docker diff”命令显示的是容器和启动它的镜像之间的差异。相反,我想显示的是两个镜像之间的差异(相同血统):“tree”和“git”图像ID。这可能吗?
谢谢。

1bqhqjot

1bqhqjot1#

请看:
https://github.com/GoogleCloudPlatform/container-diff
这个工具可以区分本地或远程docker镜像,并且可以在不需要安装docker的情况下做到这一点。它具有文件和包级别“不同”(例如:apt、npm和pip),以便您可以更轻松地查看两个docker镜像之间更改的包的差异。
免责声明:我是这个项目的贡献者

c6ubokkw

c6ubokkw2#

这一个为我工作:

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*

其中e5 cba 87 ecd 29和b1 d19 fe 1a 941是我感兴趣的图像,而/path/to/files是一个目录,可以是“/”。它列出了所有文件,对其进行排序,并添加哈希值,以防万一。meld突出显示了所有差异。

tzcvj98z

tzcvj98z3#

我想您可以通过docker export CONTAINER_IDdocker save IMAGE_ID(根据评论更新)将两个图像的文件系统发送到tarball中。
然后使用任何你喜欢的工具来区分文件系统- Git,Rdiff等。

zd287kbt

zd287kbt4#

现在是2019年,我刚刚发现了一个有用的工具,它在2017年底发布。
以下内容来自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
c6ubokkw

c6ubokkw5#

每个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来查看更改了什么。

5ssjco0h

5ssjco0h6#

如果您知道容器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直接比较它们。

6yt4nkrj

6yt4nkrj7#

请看:
https://github.com/moul/docker-diff
他们列出了Mac的Brew安装说明,我假设这是一个Bash脚本,所以我假设它可以在其他 *nix环境中工作。

w6mmgewl

w6mmgewl8#

在这种情况下,你可能只需要查看两个层之间的差异,如果是这样,dive非常适合;它允许你在每一层检查文件系统,并且你可以通过改变类型(未改变、添加、删除、修改)来过滤文件。
如果你想检查两个不相关的图像之间的差异,让两个dive进程并行运行也可以。

wsxa1bj1

wsxa1bj19#

新的dedicate d命令可用,从docker scoutDocker Desktop 4.17开始(2023年3月)
Docker Desktop 4.18现在包括docker scout compare(仍然是抢先体验)。它可以比较两个图像并显示包和漏洞差异。

docker scout compare --to IMAGE|DIRECTORY|ARCHIVE IMAGE|DIRECTORY|ARCHIVE

示例:
将图像与最新标记进行比较

docker scout compare --to namespace/repo:latest namespace/repo:v1.2.3-pre

相关问题