简介
在本实验中,你将学习如何使用 docker buildx history logs
命令查看 Docker 构建日志。首先,你将构建一个 Docker 镜像并检查其历史记录,以了解构建过程并识别构建引用(build reference)。
接着,你将使用该构建引用来检索并查看特定构建的详细日志。最后,你将探索如何通过不同的进度输出类型查看这些构建日志,从而深入了解构建执行情况并排查潜在问题。
在本实验中,你将学习如何使用 docker buildx history logs
命令查看 Docker 构建日志。首先,你将构建一个 Docker 镜像并检查其历史记录,以了解构建过程并识别构建引用(build reference)。
接着,你将使用该构建引用来检索并查看特定构建的详细日志。最后,你将探索如何通过不同的进度输出类型查看这些构建日志,从而深入了解构建执行情况并排查潜在问题。
在本步骤中,你将学习如何通过 Dockerfile 构建 Docker 镜像并查看其历史记录。历史记录显示了构成镜像的各层以及用于创建每层的命令。
首先,在你的 ~/project
目录下创建一个简单的 Dockerfile。该 Dockerfile 将基于 ubuntu
镜像创建一个安装了 curl
包的镜像。
cd ~/project
nano Dockerfile
将以下内容添加到 Dockerfile
中:
FROM ubuntu:latest
RUN apt-get update && apt-get install -y curl
保存文件并退出编辑器(按 Ctrl+X,输入 Y,然后按 Enter)。
现在,让我们使用 docker build
命令构建 Docker 镜像。我们将为镜像打上 my-ubuntu-curl
名称和 latest
标签。命令末尾的 .
表示 Dockerfile 位于当前目录。
docker build -t my-ubuntu-curl:latest .
你将看到显示构建过程的输出,其中会执行 Dockerfile 中定义的每个步骤。
构建完成后,你可以使用 docker history
命令查看镜像的历史记录。
docker history my-ubuntu-curl:latest
输出将显示一个表格,包含各层的信息,包括层 ID、创建时间、大小以及用于创建该层的命令。这些历史记录对于理解镜像的构建方式和调试非常有用。
在上一步中,你构建了 Docker 镜像并查看了其历史记录。历史记录输出包含一个「BUILD REFERENCE」列。这个引用是创建该镜像的构建过程的唯一标识符,它不同于镜像 ID,专门与构建过程本身相关,而非最终的镜像层。
让我们再次查看历史记录以确定构建引用。
docker history my-ubuntu-curl:latest
在输出中,找到与构建过程对应的行。通常是第一行(不包括基础镜像层),且「BUILD REFERENCE」列会有值。这个值是一个长字符串。
例如,输出可能类似这样(具体值会有所不同):
IMAGE CREATED CREATED BY SIZE COMMENT BUILD REFERENCE
a1b2c3d4e5f6 2 hours ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
g7h8i9j0k1l2 2 hours ago /bin/sh -c #(nop) ADD file:abcdef1234567890... 73.9MB
m3n4o5p6q7r8 2 hours ago /bin/sh -c apt-get update && apt-get install... 30MB buildkit.dockerfile.v0 buildkit:abcdef1234567890abcdef1234567890
在这个例子中,构建引用是 buildkit:abcdef1234567890abcdef1234567890
。注意构建引用通常以 buildkit:
开头,后跟唯一标识符。
在下一步中查看特定构建过程的日志时,你将需要这个构建引用。请从你的输出中复制这个构建引用。
在上一步中,你从镜像历史记录中获取了构建引用。这个构建引用可以让你查看该特定构建过程的详细日志,对于调试构建失败或了解构建过程中产生的确切输出特别有用。
要查看特定构建的日志,你需要使用 docker buildx logs
命令并跟上构建引用。请记得将 YOUR_BUILD_REFERENCE
替换为你在上一步中找到的实际构建引用。
docker buildx logs YOUR_BUILD_REFERENCE
例如,如果你的构建引用是 buildkit:abcdef1234567890abcdef1234567890
,那么命令应该是:
docker buildx logs buildkit:abcdef1234567890abcdef1234567890
执行此命令将显示构建过程的完整输出,包括 Dockerfile 中每个 RUN
指令的执行结果。你将看到 apt-get update
和 apt-get install -y curl
在镜像构建时的实际输出。
相比 docker build
命令显示的摘要信息,这能提供更详细的构建过程视图。
在本步骤中,你将探索构建 Docker 镜像时查看构建进度输出的不同方式。docker build
命令提供了多种选项来控制构建进度的显示方式。
默认情况下,docker build
使用进度输出显示每个步骤的执行状态。让我们重新构建镜像以再次查看这个默认输出。
docker build -t my-ubuntu-curl:latest .
你将看到熟悉的输出,显示如 "Step 1/2"、"Step 2/2" 等步骤以及 RUN
命令的输出。
现在,让我们尝试使用 --progress
标志的不同进度输出类型。plain
输出类型以更详细的逐行格式显示构建过程,有助于查看正在运行的确切命令及其输出,而不显示进度条。
docker build --progress=plain -t my-ubuntu-curl:latest .
将此命令的输出与默认输出进行比较。你将看到构建过程中每个操作的更详细日志。
另一个有用的进度输出类型是 tty
。这是在终端中交互式构建时的默认设置,提供动态进度条。但在某些脚本场景中显式指定它可能很有用。
docker build --progress=tty -t my-ubuntu-curl:latest .
你应该会再次看到交互式进度条,与初始构建类似。
了解这些不同的进度输出类型可以让你选择最适合监控 Docker 构建的方式,无论是需要简洁的摘要还是用于调试的详细日志。
在本实验中,你学习了如何使用 docker build
和 docker history
命令从 Dockerfile 构建 Docker 镜像并查看其历史记录。你创建了一个简单的 Dockerfile,构建了标记为 my-ubuntu-curl:latest
的镜像,并通过检查历史记录输出来理解构建过程中涉及的各个层和命令。
随后,你学会了如何从 docker history
输出中识别唯一的构建引用。这个构建引用对于访问特定构建相关信息(如构建日志)至关重要,你将在后续步骤中进一步探索这些内容。