Back to Docker Practice

10.2 Buildx

10_buildx/10.2_buildx.md

1.10.02.7 KB
Original Source

10.2 使用 buildx 构建镜像

10.2.1 使用

Buildx 的使用非常直观,绝大多数情况下可以替代 docker build 命令。

你可以直接使用 docker buildx build 命令构建镜像。

bash
$ docker buildx build .
[+] Building 8.4s (23/32)
 => ...

Buildx 使用 BuildKit 引擎进行构建,支持许多新的功能,具体参考 Buildkit 一节。

需要注意的是,默认 docker driver 会把构建结果加载到本地镜像存储;使用 docker-container、remote、cloud 等 builder 时,如未指定 --load--push--output,结果通常只保留在构建缓存中。

构建前检查

Buildx 0.15 起支持构建检查:常规构建会默认检查 Dockerfile 与构建参数;如果只想做检查而不真正构建,可以使用 --check

bash
$ docker buildx build --check .

这适合作为 CI 的快速门禁:普通构建中的检查告警默认不会让构建失败,但 --check 发现问题会以非零状态退出;需要把告警提升为错误时,可在 Dockerfile 顶部配合 # check=error=true

使用 bake

docker buildx bake 是一个高级构建命令,支持从 HCL、JSON 或 Compose 文件中定义构建目标,实现复杂的流水线构建。

bash
## 从 Compose 文件构建所有服务

$ docker buildx bake

## 仅构建指定目标

$ docker buildx bake web

生成 SBOM

Buildx 支持在构建时直接生成 SBOM (Software Bill of Materials),这对于软件供应链安全至关重要。

bash
$ docker buildx build --sbom=true -t myimage .

该命令会在构建结果中包含 SPDX 或 CycloneDX 格式的 SBOM 数据。

⚠️ 注意与失败模式: 要使 SBOM (或其它 attestation 元数据) 成功附着并可见,对底层的存储格式有前置要求:默认的 classic image store 不支持 manifest list/index 这种存放 attestation 的结构。

如果只简单运行上述命令,你可能会面临 “命令成功执行,但本地镜像中看不到 SBOM” 的体会落差。

正确的解决路径有两条

  1. 推送到远端仓库:使用 docker buildx build --sbom=true --push -t myimage:tag 时,SBOM 会正确保存到远端仓库。远端 OCI 兼容的镜像仓库能够完整存储这些元数据。
  2. 启用 containerd image store:在 Docker 守护进程中启用 containerd image store 特性(Docker 29+,新安装场景默认启用,Docker Desktop 上也更容易直接使用),可以在本地查看和管理 SBOM 等 attestation 元数据。

10.2.2 官方文档