如何使用 docker buildx debug build 命令构建和检查镜像

DockerDockerBeginner
立即练习

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

简介

在本实验中,你将学习如何高效使用 docker buildx debug build 命令来构建和检查 Docker 镜像。首先,你将通过 Dockerfile 使用默认设置构建一个简单镜像。

在掌握基础操作后,你将进一步探索更高级的构建场景,包括在镜像中集成构建参数(build arguments)和标签(labels)。你还将学习如何在构建过程中针对特定平台(platforms)进行构建,并将生成的镜像输出到文件。最后,本实验将涵盖控制构建缓存(build cache)以及在构建过程中安全暴露密钥(secrets)的技术,帮助你全面理解 docker buildx debug build 命令的各项功能。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/ImageOperationsGroup -.-> docker/save("Save Image") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/run -.-> lab-555047{{"如何使用 docker buildx debug build 命令构建和检查镜像"}} docker/inspect -.-> lab-555047{{"如何使用 docker buildx debug build 命令构建和检查镜像"}} docker/images -.-> lab-555047{{"如何使用 docker buildx debug build 命令构建和检查镜像"}} docker/save -.-> lab-555047{{"如何使用 docker buildx debug build 命令构建和检查镜像"}} docker/build -.-> lab-555047{{"如何使用 docker buildx debug build 命令构建和检查镜像"}} end

使用默认设置构建简单镜像

在本步骤中,你将学习如何使用 Dockerfile 构建一个简单的 Docker 镜像。Dockerfile 是一个文本文件,包含用户可以通过命令行调用的所有指令来组装镜像。Docker 可以通过读取 Dockerfile 中的指令来自动构建镜像。

首先,导航到 ~/project 目录,这是本实验的工作目录:

cd ~/project

现在,让我们创建一个简单的 Dockerfile。我们将在 ~/project 目录下创建一个名为 Dockerfile 的文件。这个 Dockerfile 将定义基于 ubuntu 基础镜像创建镜像并安装 cowsay 软件包的步骤。

使用 nano 编辑器创建并编辑 Dockerfile

nano Dockerfile

将以下内容添加到 Dockerfile 中:

FROM ubuntu:latest
RUN apt-get update && apt-get install -y cowsay
CMD ["cowsay", "Hello, Docker!"]

让我们分解这个 Dockerfile

  • FROM ubuntu:latest:该指令指定了我们新镜像的基础镜像。我们使用的是 Docker Hub 上官方 Ubuntu 镜像的最新版本。
  • RUN apt-get update && apt-get install -y cowsay:该指令在当前镜像之上的新层中执行命令并提交结果。这里我们更新软件包列表并安装 cowsay 软件包。-y 标志会自动对提示回答 "yes"。
  • CMD ["cowsay", "Hello, Docker!"]:该指令为执行中的容器提供默认命令。当从这个镜像启动容器且未指定命令时,它将运行 cowsay "Hello, Docker!"

Ctrl + X,然后按 YEnter 保存文件。

现在我们有了 Dockerfile,可以构建镜像了。使用 docker build 命令。命令末尾的 . 告诉 Docker 在当前目录(~/project)中查找 Dockerfile。我们还将为镜像打上标签,例如 my-cowsay-image

docker build -t my-cowsay-image .

该命令将逐步执行 Dockerfile 中的指令。你将看到输出显示每个步骤的处理情况,包括下载基础镜像(如果尚未存在)和安装 cowsay

构建过程完成后,你可以使用 docker images 命令列出可用镜像来验证镜像是否创建成功:

docker images

你应该能在输出中看到 my-cowsay-image

最后,让我们从刚构建的镜像运行一个容器,看看它是否按预期工作:

docker run my-cowsay-image

该命令将基于 my-cowsay-image 创建并启动一个新容器。由于我们在 Dockerfile 中定义了 CMD 指令,容器将自动执行 cowsay "Hello, Docker!",你应该能在终端输出中看到牛说 "Hello, Docker!"。

使用构建参数和标签构建镜像

在本步骤中,你将学习如何在 Dockerfile 中使用构建参数(ARG)和标签(LABEL)。构建参数允许你向构建过程传递变量,使你的 Dockerfile 更加灵活。标签是你可以附加到镜像上的键值对,用于添加元数据。

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

cd ~/project

现在,让我们修改上一步创建的 Dockerfile。我们将添加一个构建参数来自定义 cowsay 显示的消息,并为镜像添加一个标签。

打开 Dockerfile 进行编辑:

nano Dockerfile

修改内容以包含 ARGLABEL 指令:

FROM ubuntu:latest
ARG MESSAGE="Hello, Docker!"
RUN apt-get update && apt-get install -y cowsay
LABEL maintainer="Your Name <[email protected]>"
CMD ["cowsay", "$MESSAGE"]

让我们看看这些修改:

  • ARG MESSAGE="Hello, Docker!":该指令定义了一个名为 MESSAGE 的构建参数,默认值为 "Hello, Docker!"。这个值可以在构建过程中被覆盖。
  • LABEL maintainer="Your Name <[email protected]>":该指令为镜像添加一个标签。标签可用于添加维护者信息、版本号或其他相关元数据。
  • CMD ["cowsay", "$MESSAGE"]:我们修改了 CMD 指令,使其使用 MESSAGE 构建参数的值。

Ctrl + X,然后按 YEnter 保存修改后的 Dockerfile

现在,让我们重新构建镜像,但这次我们将使用 --build-arg 标志为 MESSAGE 构建参数传递一个值。我们还将为它打上一个新标签 my-custom-cowsay-image

docker build --build-arg MESSAGE="Building with arguments!" -t my-custom-cowsay-image .

观察构建过程中的输出。你应该能看到 ARG 指令被处理,且 MESSAGE 的值被设置为 "Building with arguments!"。

构建完成后,让我们从这个新镜像运行一个容器:

docker run my-custom-cowsay-image

这次,容器应该会输出自定义消息 "Building with arguments!"。

你还可以检查镜像以查看添加的标签。使用 docker inspect 命令后跟镜像名称:

docker inspect my-custom-cowsay-image

在输出中,查找 "Labels" 部分。你应该能找到 maintainer 标签及其在 Dockerfile 中指定的值。

构建特定平台镜像并输出到文件

在本步骤中,你将学习如何为特定平台构建 Docker 镜像,以及如何将构建好的镜像输出到文件。当需要在不同架构系统(如 ARM 与 x86)上部署应用时,跨平台构建非常有用。输出到文件可以让你将镜像保存为 tar 归档文件,便于传输和在其他 Docker 环境中加载。

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

cd ~/project

我们将使用上一步中的相同 Dockerfile。你可以使用 cat 命令查看其内容:

cat Dockerfile

输出应为:

FROM ubuntu:latest
ARG MESSAGE="Hello, Docker!"
RUN apt-get update && apt-get install -y cowsay
LABEL maintainer="Your Name <[email protected]>"
CMD ["cowsay", "$MESSAGE"]

现在,让我们专门为 linux/arm64 平台构建镜像。我们将使用 --platform 标志。请注意,为不同平台构建需要 Docker Buildx,它通常包含在较新的 Docker 安装中。

docker build --platform linux/arm64 -t my-arm64-cowsay-image .

该命令将为 ARM64 架构构建镜像。你会看到与之前构建类似的输出,但构建过程针对的是不同的架构。

构建完成后,你可以列出镜像查看新创建的镜像。注意该镜像的 ARCHITECTURE 列将显示为 arm64

docker images

接下来,让我们将这个镜像输出到 tar 文件。这对于不使用注册表保存和共享镜像非常有用。我们将使用 --output 标志配合 type=tar 选项。

docker build --platform linux/arm64 -t my-arm64-cowsay-image . --output type=tar,dest=my-arm64-cowsay-image.tar

该命令会再次构建镜像(可能会使用构建缓存),然后将其保存为 ~/project 目录下名为 my-arm64-cowsay-image.tar 的 tar 文件。

你可以使用 ls 命令验证 tar 文件是否创建成功:

ls -lh my-arm64-cowsay-image.tar

你应该能看到列出的文件及其大小。这个 tar 文件包含了 my-arm64-cowsay-image 的所有层。你可以将此文件传输到另一台机器,并使用 docker load -i my-arm64-cowsay-image.tar 加载它。

构建镜像时的缓存控制与密钥管理

在本步骤中,你将学习如何控制 Docker 构建缓存,以及如何使用 BuildKit 的 secret 挂载类型在构建过程中安全处理密钥。构建缓存能显著加快构建速度,但有时需要禁用缓存。安全处理密钥对于避免将敏感信息嵌入镜像层至关重要。

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

cd ~/project

让我们修改 Dockerfile,添加需要控制缓存的步骤并演示密钥处理。我们将增加一个创建文件的简单步骤和一个假设需要使用密钥的步骤。

打开 Dockerfile 进行编辑:

nano Dockerfile

修改内容以包含创建带时间戳文件的 RUN 指令和密钥使用的占位符:

FROM ubuntu:latest
ARG MESSAGE="Hello, Docker!"
RUN apt-get update && apt-get install -y cowsay
LABEL maintainer="Your Name <[email protected]>"
RUN echo "Build time: $(date)" > /app/build_info.txt
## 这是使用密钥的命令占位符
## RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret > /app/secret_info.txt
CMD ["cowsay", "$MESSAGE"]

我们添加了 RUN echo "Build time: $(date)" > /app/build_info.txt。该命令创建了包含该层构建时间戳的 /app/build_info.txt 文件。默认情况下,Docker 会缓存各层。如果你在不修改该 RUN 指令前内容的情况下多次构建镜像,该层可能会从缓存中读取,时间戳也不会更新。

Ctrl + X,然后按 YEnter 保存修改后的 Dockerfile

现在,让我们用新标签 my-cached-image 构建镜像:

docker build -t my-cached-image .

观察输出。如果你最近构建过该镜像,可能会看到某些步骤显示 ---> Using cache

为了演示缓存控制,让我们再次构建镜像,但这次使用 --no-cache 标志完全禁用缓存:

docker build --no-cache -t my-no-cache-image .

你将看到 Docker 会重建每一层,即使指令没有改变。这在需要确保获取最新依赖项或之前构建因缓存损坏而失败时非常有用。

现在让我们讨论密钥处理。被注释掉的 ## RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret > /app/secret_info.txt 行展示了如何使用 BuildKit 处理密钥。要使用此功能,你需要启用 BuildKit(新版本 Docker 通常默认启用),并在构建时使用 --secret 标志提供密钥。

例如,如果你有一个包含密钥的 mysecret.txt 文件,构建命令如下(由于我们没有 mysecret.txt 文件且该行被注释,此命令不会实际执行,仅展示语法):

## docker build --secret id=mysecret,src=mysecret.txt -t my-secret-image .

RUN --mount=type=secret,id=mysecret 指令仅在构建步骤期间将密钥内容提供到 /run/secrets/mysecret。密钥不会包含在最终镜像层中。这是处理 API 密钥或密码等敏感信息的正确方式。

由于我们没有密钥文件且相关行已被注释,我们不会执行涉及密钥的构建命令。但理解 --no-cachesecret 挂载类型的概念对于控制构建过程和处理敏感数据非常重要。

总结

在本实验中,你学习了使用 Dockerfile 构建 Docker 镜像的基础知识。你首先基于 Ubuntu 创建了一个简单的 Dockerfile,安装了软件包并定义了默认命令。这让你初步了解了核心指令 FROMRUNCMD,以及如何使用 docker build 命令并指定标签来构建镜像。

在掌握基础知识后,你探索了更高级的镜像构建技术。你学习了如何在 Dockerfile 中使用构建参数和标签来自定义构建过程并为镜像添加元数据。你还实践了为特定平台构建镜像并将结果输出到文件的操作,展示了如何控制构建输出。最后,你深入研究了构建缓存的管理和在构建过程中安全处理密钥的方法,强调了高效安全创建镜像的最佳实践。