打开网易新闻 查看精彩图片

Docker 容器在初始创建时继承其镜像的文件系统。如果对容器的可写层进行了更改,则容器的文件系统可能会在创建后与映像的内容不同。

检查文件系统更改的能力可以帮助您调试问题并调查丢失的数据。当容器重新启动或销毁时,写入容器文件系统的文件将丢失。在某些情况下,您可能无意中执行了应该被定向到持久卷的写入。

在本文中,我们将分享一些用于识别对容器文件系统所做的修改的技术。您可以使用此信息来跟踪容器活动并调查不同环境之间的差异。

使用 Docker异

Docker CLI 有一个用于此目的的内置命令。运行将枚举对特定容器内的文件和目录所做的所有更改。它接受您要检查的容器的 ID 或名称。

docker diff

启动一个简单的容器用于演示目的:

$ docker run -it --name alpine alpine:latest sh

这将启动一个运行 Alpine 映像的新容器。您的终端窗口将附加到容器。保持这个窗口打开。

现在在第二个终端会话中运行:

docker diff

$ docker diff 高山

由于新容器仍然与 Alpine 映像的文件系统完全匹配,因此不会产生任何输出。

切换回仍连接到容器的第一个终端。运行一些添加、删除或更改文件的命令:

/#触摸演示
/#触摸示例

返回到您的第一个 shell 窗口。重复该命令以查看所做的更改:

docker diff

$ docker diff 高山
一个例子
C /根
C /root/.ash_history
一个/演示

现在这两个新文件在命令的输出中可见。Running还会向容器的 shell 历史记录添加条目。也报告了对 的修改,以及随之而来的对目录的更改。

touch

/root/.ash_history

/root

解释 Docker 差异输出

产生的每一行输出都带有前缀,或者取决于发生的更改类型:

docker diff

A

C

D

  • – 文件或目录已添加到容器的文件系统中。它在原始图像中不存在。
  • A
  • – 文件或目录的内容与镜像中的版本不同。
  • C
  • – 映像中存在的路径已从容器中删除。
  • D

此信息使您能够快速查找可以解释丢失数据或意外行为的差异。

任何未显示在输出中的文件系统更改都会影响映射到 Docker 卷的路径。这些文件存储在容器外部,独立于其文件系统,因此它们不会被.

docker diff

查看原始图像中的内容

比较原始图像中包含的文件版本会很有帮助。您可以通过创建一个新容器然后复制该文件来做到这一点。使用而不是创建容器但未启动。这将确保由图像的入口点脚本引起的修改不会影响结果。

docker create

docker run

$ docker create --name temp-container my-image:latest
$ docker cp temp-container:/path/to/file 复制文件
$ docker rm 临时容器

另一种方法是使用自定义入口点运行容器,该入口点将文件的内容发送到标准输出流。包括标志,以便在命令完成后自动删除容器:

--rm

$ docker run --rm --entrypoint cat alpine:latest /path/to/file > 复制文件

比较两个容器之间的差异

有时您可能需要比较运行同一映像的两个不同容器之间的差异。首先用于获取单个更改列表:

docker diff

$ docker diff first-container > first
$ docker diff 第二个容器 > 第二个

现在您可以使用标准 Unix 工具(例如命令)来查找两个更改列表中的差异:

diff

第一秒不同
3c3
< A /a-new-file
---
> 一个/演示

差异显示在添加时已在第二个容器中删除。

/a-new-file

/demo

比较容器的另一种方法是使用tar 命令来访问综合文件列表:

docker export

$ docker export 演示容器 | 焦油电视
-rwxr-xr-x 0/0 0 2022-06-21 14:21 .dockerenv
drwxr-xr-x 0/0 0 2022-05-23 17:51 bin/
lrwxrwxrwx 0/0 0 2022-05-23 17:51 bin/arch -> /bin/busybox
lrwxrwxrwx 0/0 0 2022-05-23 17:51 bin/ash -> /bin/busybox
lrwxrwxrwx 0/0 0 2022-05-23 17:51 bin/base64 -> /bin/busybox
lrwxrwxrwx 0/0 0 2022-05-23 17:51 bin/bbconfig -> /bin/busybox
...

对两个容器重复此命令。然后您可以使用来比较这两个列表。tar 的增强输出可以帮助您跟踪文件何时更改,因为会显示修改时间和权限。

diff

概括

Docker 容器的文件系统应该与创建它们的镜像非常相似。当容器内的软件将内容直接写入文件系统时,可能会出现差异。当使用诸如在正在运行的容器中运行命令的机制时,用户可能是另一个差异来源。

docker exec

该实用程序提供了一种方便的方式来查看这些更改。尽管您看不到文件被添加或删除的原因,但检索修改列表的能力对于理解为什么观察到特定行为非常宝贵。

docker diff

在本文中,我们专注于检查对运行容器所做的更改。您可以使用不同的工具(例如Dive)来检查对 Docker 映像中的层所做的更改。这两种方法可以串联使用,让您计算出在容器的层堆栈中添加或修改文件的确切点。

docker history