天天看點

下一代 docker 建構元件Buildkit

BuildKit 簡介

buildkit 是下一代 docker 建構元件,擁有衆多特性:

  • 自動垃圾收集
  • 可擴充的前端格式
  • 并發依賴項解析
  • 高效的指令緩存
  • 建構緩存導入/導出
  • 嵌套的建構作業調用
  • 可配置的建構底層,包括 OCI (runc)和 containerd,未來将加入更多的建構底層
  • 多種輸出格式
  • 可插拔架構
  • 無需 root 權限

BuildKit的build輸出:

下一代 docker 建構元件Buildkit

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 中的目錄(隻讀)綁定到建構容器中。

選項 描述

target

 (required)
挂載路徑.

source

源路徑基于

from

. 預設是

from

的根路徑.

from

指定挂載的源頭,可以是建構階段名稱或者鏡像名稱. 預設為建構上下文.

rw

,

readwrite

讀寫模式,資料将會被丢棄.
  • RUN --mount=type=cache

    此挂載類型允許挂載緩存目錄,進而通路緩存。

Option Description

id

可選 區分不同的緩存

target

ro

readonly

是否隻讀.

sharing

shared

private

locked

三者其一. 預設

shared

shared

 緩存挂載可以被多個寫入器同時使用. 

private

 如果有多個寫入,則建立一個新的挂載. 

locked

 暫停第二個寫入器,直到第一個寫入器釋放mount.

from

作為緩存挂載的基礎的建構階段名稱。預設為空目錄

source

将要挂載的

from

的子路徑. 預設是

from

mode

新緩存目錄的檔案模式. 預設0755.

uid

新緩存目錄的使用者ID. 預設為0.

gid

新緩存目錄的組ID. 預設為0.
  • RUN --mount=type=tmpfs

    這種挂載類型允許在build容器時挂載tmpfs。

target

  • RUN --mount=type=secret 這種挂載類型允許生成容器通路安全檔案,比如私鑰,而無需将它們放入映像中

id

secret的id. 預設為target path的basename.

target

挂載路徑. 預設

/run/secrets/

 + 

id

.

required

如果設定為

true

,當secret不可用時,指令會出錯。預設為

false

mode

檔案的模式. 預設為0400.

uid

UID. 預設 0.

gid

Group ID. 預設 0.
  • RUN --mount=type=ssh

    這種挂載類型允許建構容器通過ssh agent通路 SSH keys,并支援密碼.

id

SSH代理套接字或密鑰ID. 預設為"default".

target

SSH代理套接字路徑. 預設為

/run/buildkit/ssh_agent.${N}

required

true

false

mode

套接字檔案模式. 預設0600.

uid

socket的使用者ID. 預設0.

gid

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
           

BuildKit 支援情況