如何使用 docker buildx history inspect attachment 命令检查构建附件

DockerDockerBeginner
立即练习

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

简介

在本实验中,你将学习如何使用 docker buildx history inspect attachment 命令来检查与 Docker 镜像构建相关的附件。首先,你将通过使用 --attest 标志构建一个 Docker 镜像并为其附加文件。

构建完成后,你将探索如何列出构建历史以识别包含附件的构建引用。最后,你将练习使用获取到的引用来检查附加文件,并通过指定附件类型和平台进一步细化检查。这个实践过程将展示如何访问和验证嵌入在 Docker 镜像中的元数据。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) 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-555051{{"如何使用 docker buildx history inspect attachment 命令检查构建附件"}} docker/images -.-> lab-555051{{"如何使用 docker buildx history inspect attachment 命令检查构建附件"}} docker/build -.-> lab-555051{{"如何使用 docker buildx history inspect attachment 命令检查构建附件"}} end

构建带附件的镜像

在这一步骤中,我们将学习如何构建 Docker 镜像并为其附加元数据。附件是一种将额外信息(如构建来源、软件物料清单 SBOM 或其他相关数据)与镜像关联的方式。

首先,让我们创建一个简单的 Dockerfile。如果你当前不在 ~/project 目录,请先导航至该目录:

cd ~/project

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

nano Dockerfile

将以下内容添加到 Dockerfile 中:

FROM alpine:latest
CMD ["echo", "Hello, Docker Attachments!"]

这个 Dockerfile 非常简单,它使用 alpine:latest 作为基础镜像,并定义了一个在容器启动时打印消息的命令。

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

接下来,我们需要创建一个将附加到镜像的文件。让我们创建一个名为 attachment.txt 的简单文本文件:

nano attachment.txt

attachment.txt 中添加一些内容,例如:

This is an example attachment for the Docker image.
It can contain any relevant metadata.

保存文件并退出 nano

现在,我们将构建 Docker 镜像并附加 attachment.txt 文件。我们将使用带有 --attest 标志的 docker build 命令。--attest 标志允许你指定要包含在镜像构建中的附件,格式为 type=类型,dest=目标路径,src=源文件

在我们的例子中,我们将使用 type=sbom(软件物料清单)作为类型,dest=/sbom/attachment.txt 作为附件内的目标路径,src=attachment.txt 作为本地文件系统中的源文件。我们还将镜像标记为 my-attached-image:latest

在构建之前,请确保已安装必要的 buildx 插件。如果没有,你可能需要安装它。但对于基本附件功能,内置构建器应该足够。

让我们构建镜像:

docker build -t my-attached-image:latest --attest type=sbom,dest=/sbom/attachment.txt,src=attachment.txt .

命令末尾的 . 指定了构建上下文,即当前目录(~/project)。

你将看到输出显示镜像正在构建且附件正在被处理。

构建完成后,你可以通过列出本地镜像来验证镜像是否创建成功:

docker images

你应该能在列表中看到 my-attached-image

列出构建历史以查找引用

在上一步中,我们构建了一个带附件的 Docker 镜像。现在,我们需要找到这个附件的引用以便进行检查。附件是与构建历史相关联的,而不是直接与最终的镜像标签关联。

我们可以使用 docker buildx imagetools inspect 命令来查看镜像及其相关附件的信息。该命令需要镜像引用作为参数。

让我们检查之前构建的镜像 my-attached-image:latest

docker buildx imagetools inspect my-attached-image:latest

该命令将输出镜像清单的详细信息。在输出中查找 attestations 部分,这里列出了与镜像关联的附件。

attestations 部分中,你会看到每个附件的条目。每个条目都有一个 ref 字段,这个 ref 就是我们用来检查附件内容所需的引用。它的格式类似于 sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

复制你添加的附件(type=sbom 的那个)对应的 ref 字段值。这个引用将在下一步中使用。

例如,如果输出显示:

{
  "manifest": {
    ...
  },
  "attestations": [
    {
      "ref": "sha256:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890",
      "type": "sbom",
      "platform": {
        "architecture": "amd64",
        "os": "linux"
      }
    }
  ]
}

那么你需要的引用就是 sha256:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890。注意你实际的引用会有所不同。

请保留这个引用以便下一步使用。

使用引用检查附件内容

在上一步中,我们使用 docker buildx imagetools inspect 找到了与 Docker 镜像关联的附件引用。现在,我们将使用这个引用来检查附件的内容。

我们可以使用 docker buildx attestation inspect 命令,通过附件引用来查看特定附件的详细信息。

请回想你在上一步获取的引用,它的格式应该是 sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

<attachment_reference> 替换为你实际复制的引用值:

docker buildx attestation inspect <attachment_reference>

例如,如果你的引用是 sha256:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890,那么命令应该是:

docker buildx attestation inspect sha256:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890

该命令将输出附件的内容。你应该能看到在步骤 1 中添加到 attachment.txt 文件的文本内容。

输出内容通常会包含一些关于附件的元数据,后面跟着实际的内容。请查找包含 "This is an example attachment..." 文本的部分。

这演示了如何通过唯一引用检索附件内容,这对于验证附加数据的完整性和内容非常有用。

通过指定类型和平台检查附件

在上一步中,我们使用直接引用来检查附件。不过,你也可以通过指定附件类型和构建平台来检查与镜像关联的附件。这在镜像包含多种类型或不同架构的附件时特别有用。

我们将再次使用 docker buildx attestation inspect 命令,但这次我们会提供镜像引用、附件类型和平台信息。

镜像引用是 my-attached-image:latest
我们使用的附件类型是 sbom
在 LabEx 环境中,我们的构建平台通常是 linux/amd64

命令格式为 docker buildx attestation inspect <image_reference> --type <attachment_type> --platform <platform>

让我们用这个方法检查附件:

docker buildx attestation inspect my-attached-image:latest --type sbom --platform linux/amd64

这个命令同样会输出附件内容,与上一步的结果类似。这证明你可以通过指定镜像、类型和平台来获取附件信息。

当你明确知道要查找的附件类型和镜像平台时,这个方法更加方便,因为你不需要先使用 imagetools inspect 查找具体的附件引用。

现在你已经学会了如何构建带附件的 Docker 镜像,以及如何通过直接引用或指定镜像、类型和平台两种方式来检查附件内容。

总结

在本实验中,我们学习了如何使用带有 --attest 标志的 docker build 命令构建包含附加文件的 Docker 镜像,包括指定附件类型、附件内目标路径和源文件。随后,我们探索了如何使用 docker buildx history 列出构建历史,以识别包含附件的构建引用。

最后,我们实践了使用 docker buildx history inspect attachment 命令检查附加文件的方法:首先通过提供构建引用和附件目标路径,随后又通过额外指定附件类型和平台进行更精确的检查。这个过程展示了如何包含并访问与 Docker 镜像构建相关的附加元数据。