BuildKit 簡介
buildkit 是下一代 docker 建構元件,擁有衆多特性:
- 自動垃圾收集
- 可擴充的前端格式
- 并發依賴項解析
- 高效的指令緩存
- 建構緩存導入/導出
- 嵌套的建構作業調用
- 可配置的建構底層,包括 OCI (runc)和 containerd,未來将加入更多的建構底層
- 多種輸出格式
- 可插拔架構
- 無需 root 權限
BuildKit的build輸出:

Buildkit 内部格式 LLB
BuildKit建構基于一種稱為 LLB 的二進制中間格式,該格式用于為建構流程定義依賴關系圖,依賴 LLB 的優點,它為建構流程提供強大的特性:
- 可封裝為 Protobuf messages
- 并行執行
- 高效緩存
- 供應商中立[可自定義其實作]
BuildKit 新文法之 RUN --mount
注意:為了支援此文法,需在 dockerfile 檔案加入以下内容
# syntax=docker/dockerfile:1.2
RUN --mount 允許您建立 mount,該 mount 作為建構期間可以通路的一部分。該特性可用于從建構的其他部分綁定檔案,而無需複制、通路建構 secrets 或 ssh-agent 套接字,或者建立緩存位置進而加速建構。
支援以下文法:
-
RUN --mount=type=bind 預設挂載類型
這種挂載類型允許将上下文或 image 中的目錄(隻讀)綁定到建構容器中。
選項 | 描述 |
---|---|
(required) | 挂載路徑. |
| 源路徑基于 . 預設是 的根路徑. |
| 指定挂載的源頭,可以是建構階段名稱或者鏡像名稱. 預設為建構上下文. |
, | 讀寫模式,資料将會被丢棄. |
-
RUN --mount=type=cache
此挂載類型允許挂載緩存目錄,進而通路緩存。
Option | Description |
---|---|
| 可選 區分不同的緩存 |
| |
| 是否隻讀. |
| , 三者其一. 預設 . 緩存挂載可以被多個寫入器同時使用. 如果有多個寫入,則建立一個新的挂載. 暫停第二個寫入器,直到第一個寫入器釋放mount. |
| 作為緩存挂載的基礎的建構階段名稱。預設為空目錄 |
| 将要挂載的 的子路徑. 預設是 |
| 新緩存目錄的檔案模式. 預設0755. |
| 新緩存目錄的使用者ID. 預設為0. |
| 新緩存目錄的組ID. 預設為0. |
-
RUN --mount=type=tmpfs
這種挂載類型允許在build容器時挂載tmpfs。
|
- RUN --mount=type=secret 這種挂載類型允許生成容器通路安全檔案,比如私鑰,而無需将它們放入映像中
| secret的id. 預設為target path的basename. |
| 挂載路徑. 預設 + . |
| 如果設定為 ,當secret不可用時,指令會出錯。預設為 |
| 檔案的模式. 預設為0400. |
| UID. 預設 0. |
| Group ID. 預設 0. |
-
RUN --mount=type=ssh
這種挂載類型允許建構容器通過ssh agent通路 SSH keys,并支援密碼.
| SSH代理套接字或密鑰ID. 預設為"default". |
| SSH代理套接字路徑. 預設為 |
| |
| 套接字檔案模式. 預設0600. |
| socket的使用者ID. 預設0. |
| socket的組ID. 預設0. |
BuildKit 新文法之 RUN --security=insecure|sandbox
注意: 使用此文法需要在dockerfile加入以下内容:
#syntax=docker/dockerfile:1.2-labs
使用--security=insecure,建構器可以在非安全模式下運作非沙盒的指令,再運作需要特權的工作流中是需要的(例如containerd)。作用類似于
docker run --privileged
。為了啟用此特性,
security.insecure
應該開啟,即在buildkitd啟動時開啟(--allow-unsecure-entitlement security.insecure)和(--allow security.insecure)選項。
預設的sandbox模式可以通過 --security=sandbox開啟,但這是沒什麼作用的。
BuildKit 新文法之 RUN --network=none|host|default
#syntax=docker/dockerfile:1.2-labs