我有一个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_ID
或docker save IMAGE_ID
(根据评论更新)将两个图像的文件系统发送到tarball
然后使用你喜欢的任何工具来区分文件系统 - Git,Rdiff等.
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
看看改变了什么.
如果您知道容器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直接比较它们.
这个对我有用:
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 是一个可以是“/”的目录。它列出所有文件,对其进行排序并添加哈希以防万一。并融合突出了所有差异。
从Docker Desktop 4.17docker scout
(2023 年 3 月)开始,提供了新的专用 d 命令。
另外:nerdctl
v1.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)
例子:
将图像与最新标签进行比较
Run Code Online (Sandbox Code Playgroud)docker scout compare --to namespace/repo:latest namespace/repo:v1.2.3-pre
nerdctl diff
是通过Min Uk Lee的PR 2626完成的,在第 1376 期之后minuk-dev)
检查容器文件系统上文件或目录的更改
用法:
nerdctl diff CONTAINER
看一下:
https://github.com/moul/docker-diff
他们列出Brew
了Mac的安装说明,我假设它是一个Bash脚本,所以我认为它可以在其他*nix环境中工作.
现在是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)
归档时间: |
|
查看次数: |
32299 次 |
最近记录: |