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

jd.*_*jd. 47 docker

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

RUN apt-get install -y tree
RUN apt-get install -y git
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢.

jer*_*rng 15

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

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

  • `docker save`用于图像 (3认同)
  • `docker export`将容器ID作为参数,而不是图像ID (2认同)

aar*_*dle 15

看一下 :

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

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

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


Joh*_*mke 12

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

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

CONTAINER ID  IMAGE        COMMAND               CREATED        STATUS ...
53d7dadafee7  f71e394eb0fc /bin/sh -c apt-get i  7 minutes ago  Exit 0 ...
...
Run Code Online (Sandbox Code Playgroud)

现在你可以做docker diff 53d7dadafee7看看改变了什么.

  • 谢谢这个工作,虽然我必须使用容器,但它并不理想:我不能在我的构建中使用-rm选项,或者如果稍后我将容器清理,那么信息就会丢失.能够区分2个相关图像真是太棒了:"docker diff base_image base_grandchild" (7认同)

ose*_*003 9

如果您知道容器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
......
Run Code Online (Sandbox Code Playgroud)

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

如果您坚持使用图像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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

请注意,如果您正在使用泊坞窗机,你需要首先输入它 docker-machine ssh然后sudo sh.

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


fal*_*s4e 9

这个对我有用:

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*
Run Code Online (Sandbox Code Playgroud)

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


Von*_*onC 7

从Docker Desktop 4.17docker scout (2023 年 3 月)开始,提供了新的专用 d 命令。

另外:nerdctlv1.7.1(2023 年 11 月)已实施nerdctl diff(请参阅本答案的最后部分)。


Docker Desktop 4.18现已包含docker scout compare(仍处于早期访问阶段)。它可以比较两个图像并显示包和漏洞差异。

docker scout compare --to IMAGE|DIRECTORY|ARCHIVE IMAGE|DIRECTORY|ARCHIVE
Run Code Online (Sandbox Code Playgroud)

例子:

将图像与最新标签进行比较

docker scout compare --to namespace/repo:latest namespace/repo:v1.2.3-pre
Run Code Online (Sandbox Code Playgroud)

https://pbs.twimg.com/media/FtDw7paXwAYoUAu?format=jpg&name=small


nerdctl diff是通过Min Uk LeePR 2626完成的,在第 1376 期之后minuk-dev)

检查容器文件系统上文件或目录的更改

用法:nerdctl diff CONTAINER


Big*_*ich 6

看一下:

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

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

  • 不错的工具。仅供参考,它基本上是运行容器,导出到 tarball,并比较文件列表。 (3认同)

tik*_*ael 5

现在是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]
Run Code Online (Sandbox Code Playgroud)

同样,您可以一次运行许多分析器:

container-diff diff <img1> <img2> --type=history --type=apt --type=node
Run Code Online (Sandbox Code Playgroud)