如何使用 docker buildx history trace 查看构建追踪信息

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何使用 docker buildx history trace 命令来查看和分析 Docker 镜像的构建追踪记录。首先,你将通过标准 Docker 命令构建一个简单的 Docker 镜像并记录其构建历史。

完成初始构建后,你将探索如何列出已记录的构建历史条目,并深入了解如何查看特定构建记录的详细 OpenTelemetry 追踪数据。最后,你将学习如何比较两个不同构建记录的追踪数据,从而获得对构建过程及潜在优化方案的有价值洞察。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/inspect -.-> lab-555056{{"如何使用 docker buildx history trace 查看构建追踪信息"}} docker/images -.-> lab-555056{{"如何使用 docker buildx history trace 查看构建追踪信息"}} docker/build -.-> lab-555056{{"如何使用 docker buildx history trace 查看构建追踪信息"}} end

构建镜像并记录其历史

在本步骤中,你将学习如何构建 Docker 镜像并记录其构建历史。Docker 镜像是通过 Dockerfile 构建的,这是一个包含所有用户可以通过命令行调用来组装镜像的指令的文本文件。

首先,让我们创建一个简单的 Dockerfile。如果你尚未进入 ~/project 目录,请先导航至该目录。

cd ~/project

现在,使用 nano 编辑器创建一个名为 Dockerfile 的文件。

nano Dockerfile

将以下内容添加到 Dockerfile 中:

FROM ubuntu:latest
RUN apt-get update && apt-get install -y --no-install-recommends fortune-mod
CMD ["/usr/games/fortune"]

这个 Dockerfile 基于最新的 Ubuntu 镜像,更新软件包列表,安装 fortune-mod 软件包,并将默认命令设置为运行 fortune 程序。

保存文件并退出 nano(按下 Ctrl + X,然后输入 Y,最后按 Enter)。

现在,让我们使用 docker build 命令构建 Docker 镜像。我们将镜像标记为 my-fortune-image,并使用当前目录(.)作为构建上下文。

docker build -t my-fortune-image .

你将看到构建过程的输出,包括下载基础镜像和运行 apt-get 命令的步骤。

要记录构建历史,我们可以使用 docker history 命令。该命令显示镜像的历史记录。

docker history my-fortune-image

输出将显示组成镜像的各层列表,包括创建每层所使用的命令、层的大小以及创建时间。这些历史记录对于理解镜像的构建过程和调试非常有用。

列出构建历史记录

在本步骤中,你将学习如何查看 Docker 镜像的构建历史记录。正如前一步骤所见,docker history 命令可以详细展示组成镜像的各层信息。

让我们再次为上一步构建的 my-fortune-image 运行 docker history 命令:

docker history my-fortune-image

输出结果包含以下列信息:

  • IMAGE:镜像层的 ID
  • CREATED:该层的创建时间戳
  • CREATED BY:创建该层所用的命令
  • SIZE:该层的大小
  • COMMENT:与该层关联的注释

输出中的每一行代表镜像中的一个层,这些层按从最新(顶部)到最旧(底部)的顺序排列。基础镜像(本例中的 ubuntu:latest)位于最底层。

你也可以使用 -q 参数仅显示镜像 ID:

docker history -q my-fortune-image

这在只需要获取层 ID 用于脚本或其他用途时非常实用。

docker history 命令是理解 Docker 镜像构成以及调试镜像层相关问题的强大工具。

查看构建记录的 OpenTelemetry 追踪信息

在本步骤中,你将学习如何查看 Docker 构建记录的 OpenTelemetry 追踪信息。OpenTelemetry 是一套用于插装、生成、收集和导出遥测数据(指标、日志和追踪)的工具、API 和 SDK 集合,可帮助你分析软件的性能和行为。Docker 可以与 OpenTelemetry 集成,提供详细的构建过程追踪。

要查看 OpenTelemetry 追踪信息,你需要在构建镜像时启用追踪功能。我们将重新构建 my-fortune-image 并启用追踪。

首先,确保你位于 ~/project 目录中:

cd ~/project

现在重新构建镜像,这次我们将设置 BUILDKIT_TRACE 环境变量来启用追踪,同时使用 --progress=plain 参数直接查看构建输出:

BUILDKIT_TRACE=trace.json docker build --progress=plain -t my-fortune-image .

该命令将重新构建镜像,并将 OpenTelemetry 追踪数据保存到当前目录下的 trace.json 文件中。

构建完成后,你可以查看 trace.json 文件的内容。该文件包含 JSON 格式的追踪数据:

cat trace.json

输出将是一个大型 JSON 对象,包含构建过程的详细信息,包括每个步骤的持续时间、依赖关系和其他元数据。这些追踪数据可以导入到兼容 OpenTelemetry 的追踪后端(如 Jaeger 或 Zipkin)进行可视化和分析。

虽然本实验不会设置完整的追踪后端,但了解如何生成追踪文件是利用 OpenTelemetry 进行 Docker 构建分析的第一步。

比较两个构建记录的追踪信息

在本步骤中,你将学习如何生成并比较两个不同 Docker 构建记录的 OpenTelemetry 追踪信息。追踪比较有助于识别构建之间的性能差异,特别是在修改 Dockerfile 或构建环境后尤为有用。

首先,确保你位于 ~/project 目录中:

cd ~/project

我们已经有一个来自前次构建的 trace.json 文件。让我们将其重命名为 trace1.json 以便保存:

mv trace.json trace1.json

现在,让我们对 Dockerfile 做一个小修改并重新构建镜像,生成第二个追踪文件。我们将在 Dockerfile 中添加一个简单的 LABEL 指令。

打开 Dockerfile 进行编辑:

nano Dockerfile

CMD 指令后添加以下行:

LABEL version="1.0"

更新后的 Dockerfile 应如下所示:

FROM ubuntu:latest
RUN apt-get update && apt-get install -y --no-install-recommends fortune-mod
CMD ["/usr/games/fortune"]
LABEL version="1.0"

保存文件并退出 nano

现在重新构建镜像,生成名为 trace2.json 的新追踪文件:

BUILDKIT_TRACE=trace2.json docker build --progress=plain -t my-fortune-image .

构建完成后,你将拥有两个追踪文件:trace1.jsontrace2.json

虽然直接比较原始 JSON 文件可能具有挑战性,但这些文件设计用于 OpenTelemetry 追踪后端。在实际场景中,你可以将 trace1.jsontrace2.json 导入追踪可视化工具(如 Jaeger)。该工具可让你直观比较两次构建的时间线和跨度,轻松发现执行时间差异并确定哪些步骤受到修改影响。

例如,在 Jaeger 中查看这些追踪时,你会看到 Docker 构建的各个步骤(如 FROMRUNCMDLABEL)显示为跨度。然后你可以比较两个追踪中这些跨度的持续时间,查看添加 LABEL 指令是否对构建时间产生可测量的影响。

由于本实验没有设置追踪后端,我们仅验证两个追踪文件是否存在。

总结

在本实验中,你学习了如何使用 docker build 命令从 Dockerfile 构建 Docker 镜像,并通过标记镜像以便于识别。随后你探索了如何使用 docker history 命令查看已创建镜像的构建历史,该命令能展示构建过程中使用的各层和命令信息。

实验进一步指导你如何更详细地列出构建历史记录,展示了通过 docker history 命令可获取的信息。你还学习了如何查看特定构建记录的 OpenTelemetry 追踪信息,以便对构建过程进行更深入的分析。最后,你实践了比较两个不同构建记录的追踪信息,这对于理解变更和调试构建问题非常有用。