獲取地址:https://github.com/moby/buildkit/releases
BuildKit 由buildkitd守護進程和buildctl客戶端組成。雖然buildctl客戶端可用於 Linux、macOS 和 Windows,但buildkitd守護程序目前僅可用於 Linux。
啟動buildkitd守護進程:
您需要buildkitd在主機上以 root 用戶身份運行。(默認前台執行)
$ sudo buildkitd
要buildkitd以非 root 用戶身份運行,參考https://github.com/moby/buildkit/blob/master/docs/rootless.md
buildkitd 守護進程支持兩個工作后端:OCI (runc) 和 containerd。
默認情況下,使用 OCI (runc) 后端工作。可以設置--oci-worker=false --containerd-worker=true使用 containerd 后端。
buildkitd --oci-worker=false --containerd-worker=true &
用systemd管理,參考https://github.com/moby/buildkit#systemd-socket-activation
前端是在 BuildKit 中運行並將任何構建定義轉換為 LLB 的組件。有一個名為 gateway ( gateway.v0)的特殊前端,它允許使用任何圖像作為前端。(LLB二進制中間格式)
在開發過程中,Dockerfile 前端 ( dockerfile.v0) 也是 BuildKit 存儲庫的一部分。將來,這將被移出,並且可以使用外部映像構建 Dockerfile。
構建一個 Dockerfile buildctl
buildctl build \ --frontend=dockerfile.v0 \ --local context=. \ --local dockerfile=. # or buildctl build \ --frontend=dockerfile.v0 \ --local context=. \ --local dockerfile=. \ --opt target=foo \ --opt build-arg:foo=bar
--local 將本地源文件從客戶端公開給構建器(就是特喵的目錄)。
context是 Dockerfile 前端查找構建上下文,比如在從目錄中拷貝文件到鏡像里
Dockerfile 構建文件的位置目錄。
--output 的 name 表示構建的鏡像名稱,鏡像會存在本地containerd的buildkit命名空間下
buildkit命名空間在配置文件worker.containerd.namespace,要修改此命名空間, 可以去配置 /etc/buildkit/buildkitd.toml
顯示本地構建緩存 ( /var/lib/buildkit )
如果需要憑據,buildctl將嘗試讀取 Docker 配置文件$DOCKER_CONFIG/config.json。 $DOCKER_CONFIG默認為~/.docker.
構建推送到registry
buildctl build \ --frontend=dockerfile.v0 \ --local context=. \ --local dockerfile=. \ --output type=image,name=docker.io/username/image:tag,push=true
name=[value]: 圖像名稱
push=true: 創建鏡像后推送
push-by-digest=true: 推送未命名的圖像
registry.insecure=true: 推送到不安全的 HTTP 注冊中心
oci-mediatypes=true: 在配置 JSON 中使用 OCI 媒體類型而不是 Docker 的
unpack=true:創建后解壓鏡像(用於containerd)
dangling-name-prefix=[value]: 用 命名圖像prefix@<digest>,用於匿名圖像
name-canonical=true: 添加額外的規范名稱 name@<digest>
compression=[uncompressed,gzip,estargz,zstd]: 為新創建和緩存的圖層選擇壓縮類型,gzip 為默認值。esargz 應與oci-mediatypes=true.
force-compression=true:強制將compression選項應用於所有圖層(包括已經存在的圖層)。
buildinfo=[all,imageconfig,metadata,none]:選擇要導出的構建依賴版本(默認all)。
使用緩存構建鏡像並推送到registry
inline: 將緩存嵌入到鏡像中,一起推送到注冊表中
registry: 分別推送鏡像和緩存
local: 導出到本地目錄
gha: 導出到 GitHub Actions 緩存
buildctl build \ --frontend=dockerfile.v0 \ --local context=. \ --local dockerfile=. \ --output type=image,name=docker.io/username/image:tag,push=true --export-cache type=inline
將緩存一起推送到registry,registry需要type才能導入緩存,應該指定--export-cache type=inline和--import-cache type=registry,ref=docker.io/username/image。要將緩存導出到本地目錄,應該指定--export-cache type=local
--export-cache 選項:
type=registry
mode=min (默認):僅導出結果圖像的圖層
mode=max:導出所有中間步驟的所有層。
ref=docker.io/user/image:tag: 參考
oci-mediatypes=true|false: 是否在導出的清單中使用 OCI 媒體類型。由於 BuildKitv0.8默認為 true。
--import-cache 選項:
type=registry
ref=docker.io/user/image:tag
