10.2 使用 buildx 建立映象
10.2.1 使用
Buildx 的使用非常直觀,絕大多數情況下可以替代 docker build 指令。
你可以直接使用 docker buildx build 指令建立映象。
$ 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:
$ docker buildx build --check .
這適合作為 CI 的快速門禁:普通建立中的檢查告警預設不會讓建立失敗,但 --check 發現問題會以非零狀態退出;需要把告警提升為錯誤時,可在 Dockerfile 頂部配合 # check=error=true。
使用 bake
docker buildx bake 是一個高階建立指令,支援從 HCL、JSON 或 Compose 檔案中定義建立目標,實現複雜的流水線建立。
## 從 Compose 檔案建立所有服務
$ docker buildx bake
## 僅建立指定目標
$ docker buildx bake web
生成 SBOM
Buildx 支援在建立時直接生成 SBOM (Software Bill of Materials),這對於軟體供應鏈安全至關重要。
$ docker buildx build --sbom=true -t myimage .
該指令會把 SBOM 作為建立 attestation 附加到建立結果中;BuildKit 預設使用 SPDX SBOM attestation。需要 CycloneDX 檔案時,可使用 Syft、Docker Scout 等工具另行生成或轉換。
⚠️ 注意與失敗模式: 要使 SBOM (或其它 attestation 元資料) 成功附著並可見,對底層的儲存格式有前置要求:預設的 classic image store 不支援 manifest list/index 這種存放 attestation 的結構。
如果只簡單執行上述指令,你可能會面臨 『指令成功執行,但本地映象中看不到 SBOM』 的體會落差。
正確的解決路徑有兩條:
- 推送到遠端倉庫:使用
docker buildx build --sbom=true --push -t myimage:tag時,SBOM 會正確儲存到遠端倉庫。遠端 OCI 相容的映象倉庫能夠完整儲存這些元資料。- 啟用 containerd image store:在 Docker 守護程序中啟用
containerd image store屬性(Docker 29+,新安裝場景預設啟用,Docker Desktop 上也更容易直接使用),可以在本地檢視和管理 SBOM 等 attestation 元資料。