Share feedback
Answers are generated based on the documentation.

C++ Docker 镜像的供应链安全

先决条件

  • 您已安装 Git 客户端。本节示例使用的是基于命令行的 Git 客户端,但您也可以使用任何其他客户端。
  • 您已安装 Docker Desktop,并启用了 containerd 以用于拉取和存储镜像(在 设置 > 常规 中有一个复选框)。否则,如果您使用的是 Docker Engine:
    • 您已安装 Docker SBOM CLI 插件。要在 Docker Engine 上安装该插件,请使用以下命令:

      $ curl -sSfL https://raw.githubusercontent.com/docker/sbom-cli-plugin/main/install.sh | sh -s --
    • 您已安装 Docker Scout CLI 插件。要在 Docker Engine 上安装该插件,请使用以下命令:

      $ curl -sSfL https://raw.githubusercontent.com/docker/scout-cli/main/install.sh | sh -s --
    • 您已为 Docker Engine 启用 containerd

概述

本节将指导您使用 Docker SBOM CLI 插件从 C++ Docker 镜像中提取软件物料清单 (SBOM)。SBOM 提供了软件包中所有组件的详细列表,包括其版本和许可证信息。您可以使用 SBOM 来跟踪软件的来源,并确保其符合组织的安全和许可策略。

生成 SBOM

这里我们将使用在 为您的 C++ 应用程序创建多阶段构建 指南中构建的 Docker 镜像。如果您尚未构建该镜像,请按照该指南中的步骤构建镜像。 该镜像名为 hello。要为 hello 镜像生成 SBOM,请运行以下命令:

$ docker sbom hello

该命令会显示“未发现任何软件包”。这是因为最终镜像是 scratch 镜像,不包含任何软件包。 让我们再尝试使用 Docker Scout:

$ docker scout sbom --format=list hello

此命令会告诉您相同的信息。

生成 SBOM 证明

SBOM 可以在构建过程中生成并“附加”到镜像上。这称为 SBOM 证明。 要为 hello 镜像生成 SBOM 证明,首先让我们修改 Dockerfile:

ARG BUILDKIT_SBOM_SCAN_STAGE=true

FROM ubuntu:latest AS build

RUN apt-get update && apt-get install -y build-essential

WORKDIR /app

COPY hello.cpp .

RUN g++ -o hello hello.cpp -static

# --------------------
FROM scratch

COPY --from=build /app/hello /hello

CMD ["/hello"]

第一行 ARG BUILDKIT_SBOM_SCAN_STAGE=true 启用了构建阶段的 SBOM 扫描。 现在,使用以下命令构建镜像:

$ docker buildx build --sbom=true -t hello:sbom .

此命令将构建镜像并生成 SBOM 证明。您可以通过运行以下命令验证 SBOM 是否已附加到镜像:

$ docker scout sbom --format=list hello:sbom

请注意,普通的 docker sbom 命令不会加载 SBOM 证明。

总结

在本节中,您学习了如何在构建过程中为 C++ Docker 镜像生成 SBOM 证明。 普通的镜像扫描器无法从 scratch 镜像生成 SBOM。