如何使用 docker scout sbom 命令生成并显示 SBOM

DockerDockerBeginner
立即练习

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

简介

在这个实验中,你将学习如何使用 docker scout sbom 命令为 Docker 镜像生成并显示软件物料清单(Software Bill of Materials,SBOM)。你将从生成并显示 JSON 格式的基本 SBOM 开始,该清单会详细列出镜像中的软件组件。

在生成基本 SBOM 之后,你将探索如何显示 SBOM 中更易读的软件包列表。你还将学习如何按类型过滤此软件包列表,以便专注于特定类别的组件。最后,你将练习将生成的 SBOM 写入文件,以备后续使用或分析。这个实验将让你掌握利用 docker scout sbom 来了解 Docker 镜像组成的基本技能。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/VolumeOperationsGroup(["Volume Operations"]) docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/ImageOperationsGroup -.-> docker/load("Load Image") docker/VolumeOperationsGroup -.-> docker/cp("Copy Data Between Host and Container") subgraph Lab Skills docker/ls -.-> lab-555215{{"如何使用 docker scout sbom 命令生成并显示 SBOM"}} docker/inspect -.-> lab-555215{{"如何使用 docker scout sbom 命令生成并显示 SBOM"}} docker/pull -.-> lab-555215{{"如何使用 docker scout sbom 命令生成并显示 SBOM"}} docker/images -.-> lab-555215{{"如何使用 docker scout sbom 命令生成并显示 SBOM"}} docker/load -.-> lab-555215{{"如何使用 docker scout sbom 命令生成并显示 SBOM"}} docker/cp -.-> lab-555215{{"如何使用 docker scout sbom 命令生成并显示 SBOM"}} end

生成并显示 JSON 格式的基本 SBOM

在这一步中,你将学习如何为 Docker 镜像生成基本的软件物料清单(Software Bill of Materials,SBOM),并以 JSON 格式显示它。SBOM 是构成软件组件的正式成分列表。它就像软件的装箱单,详细列出了所使用的所有第三方组件、库和依赖项。生成 SBOM 对于了解软件的安全状况和许可合规性至关重要。

你将使用 syft 工具来生成 SBOM。syft 是一个用于从容器镜像和文件系统生成 SBOM 的命令行工具和库。

首先,拉取一个用于演示的简单 Docker 镜像。你将使用 alpine:latest 镜像,它是一个轻量级的 Linux 发行版。

docker pull alpine:latest

你应该会看到表明镜像正在被拉取和下载的输出。

Using default tag: latest
latest: Pulling from library/alpine
...
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest

现在你已经有了镜像,可以生成 SBOM 了。你将使用 syft 命令,指定镜像名称并将输出格式设置为 JSON。

syft alpine:latest -o json

这个命令将分析 alpine:latest 镜像,并将 SBOM 以 JSON 格式直接输出到你的终端。输出将是一个大型的 JSON 对象,包含镜像中找到的软件包的信息,包括它们的名称、版本、许可证和类型。

你可以滚动查看输出,查看 SBOM 中列出的不同组件。这个基本的 JSON 输出提供了镜像内软件组件的全面视图。

显示 SBOM 中的软件包列表

在上一步中,你生成了一个详细的 JSON 格式的 SBOM。虽然 JSON 输出内容全面,但在终端中直接阅读可能会有困难。在这一步中,你将学习如何显示 Docker 镜像中软件包的更易读列表。

syft 提供了一种易于浏览和理解的简单表格格式。你可以使用 -o table 选项以这种格式生成 SBOM。

syft alpine:latest -o table

这个命令将再次分析 alpine:latest 镜像,但这次会以表格形式输出 SBOM。该表格通常会包含 NAMEVERSIONTYPELOCATIONS 等列。

你应该会看到类似以下的输出:

 ✔ Loaded image
 ✔ Analyzed image
 ├── apk
 │   ├── busybox
 │   ├── alpine-baselayout
 │   ├── alpine-keys
 │   ├── apk-tools
 │   ├── zlib
 │   ├── libcrypto1.1
 │   ├── libssl1.1
 │   ├── musl
 │   ├── musl-utils
 │   ├── scanelf
 │   ├── ssl_certs
 │   └── zlib
 └── filesystem
     └── etc/os-release

这种表格格式让你能更轻松地快速查看镜像中安装的软件包的名称和版本。这对于快速了解镜像的内容特别有用。

按类型过滤软件包列表

在上一步中,你以表格形式显示了 SBOM,这比 JSON 输出更易于阅读。然而,有时你可能只对特定类型的软件包感兴趣。例如,你可能只想查看操作系统软件包或应用程序依赖项。

syft 允许你使用 --package-type 选项按类型过滤软件包列表。你可以指定一个或多个要包含在输出中的软件包类型。常见的软件包类型包括 apkdebrpmgemnpmpipgo-module 等。对于 alpine:latest 镜像,主要的软件包类型是 apk

让我们过滤 SBOM,只显示类型为 apk 的软件包。

syft alpine:latest -o table --package-type apk

这个命令将以表格格式生成 SBOM,但只包含软件包类型为 apk 的条目。

你应该会看到类似于上一步表格的输出,但如果镜像中存在其他软件包类型,条目可能会更少(不过对于像 Alpine 这样的最小化镜像,apk 是主要类型)。

 ✔ Loaded image
 ✔ Analyzed image
 ├── apk
 │   ├── busybox
 │   ├── alpine-baselayout
 │   ├── alpine-keys
 │   ├── apk-tools
 │   ├── zlib
 │   ├── libcrypto1.1
 │   ├── libssl1.1
 │   ├── musl
 │   ├── musl-utils
 │   ├── scanelf
 │   ├── ssl_certs
 │   └── zlib

当你需要关注容器镜像中特定层或特定类型的依赖项时,这种过滤功能非常有用。

将 SBOM 写入文件

在前面的步骤中,你直接在终端中以不同格式显示了 SBOM。虽然这对于快速检查很有用,但你通常需要将 SBOM 保存到文件中,以便进行进一步的处理、分析或共享。

syft 允许你使用 -o 选项将 SBOM 输出写入文件,后面跟上所需的格式并将输出重定向到一个文件。你可以以多种格式输出 SBOM,包括 JSON、SPDX 和 CycloneDX。JSON 是一种常见且通用的格式。

让我们以 JSON 格式生成 SBOM,并将其保存到当前目录(~/project)中名为 alpine_sbom.json 的文件中。

syft alpine:latest -o json > alpine_sbom.json

这个命令将以 JSON 格式为 alpine:latest 镜像生成 SBOM,并将输出重定向到 alpine_sbom.json 文件。这次你不会在终端中看到 JSON 输出。

为了验证文件是否已创建并包含 SBOM 数据,你可以使用 ls 命令列出当前目录中的文件,并使用 cat 命令显示文件内容。

ls

你应该会看到 alpine_sbom.json 列在文件列表中。

alpine_sbom.json

现在,让我们查看文件的内容:

cat alpine_sbom.json

你应该会看到在第一步中看到的 JSON 格式的 SBOM 输出,但现在它存储在 alpine_sbom.json 文件中。

将 SBOM 保存到文件是将 SBOM 生成集成到 CI/CD 管道或与他人共享 SBOM 的标准做法。

总结

在本次实验中,你学习了如何使用 syft 工具为 Docker 镜像生成并显示基本的软件物料清单(Software Bill of Materials,SBOM)。你首先拉取了 alpine:latest 镜像,然后使用 syft alpine:latest -o json 命令以 JSON 格式生成并显示 SBOM,该 SBOM 提供了镜像内软件组件的详细列表。

接着,你探索了如何从 SBOM 中显示更易于阅读的软件包列表,如何按软件包类型过滤此列表,最后,如何将生成的 SBOM 写入文件以便后续使用或分析。这些步骤展示了 syft 在理解 Docker 镜像组成方面的基本功能。