简介
在本实验中,你将学习如何使用 docker buildx history inspect attachment
命令来检查与 Docker 镜像构建相关的附件。首先,你将通过使用 --attest
标志构建一个 Docker 镜像并为其附加文件。
构建完成后,你将探索如何列出构建历史以识别包含附件的构建引用。最后,你将练习使用获取到的引用来检查附加文件,并通过指定附件类型和平台进一步细化检查。这个实践过程将展示如何访问和验证嵌入在 Docker 镜像中的元数据。
💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版
在本实验中,你将学习如何使用 docker buildx history inspect attachment
命令来检查与 Docker 镜像构建相关的附件。首先,你将通过使用 --attest
标志构建一个 Docker 镜像并为其附加文件。
构建完成后,你将探索如何列出构建历史以识别包含附件的构建引用。最后,你将练习使用获取到的引用来检查附加文件,并通过指定附件类型和平台进一步细化检查。这个实践过程将展示如何访问和验证嵌入在 Docker 镜像中的元数据。
在这一步骤中,我们将学习如何构建 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 镜像构建相关的附加元数据。