Docker 容器驅動程式

Docker 容器驅動程式允許在專用的 Docker 容器中建立一個託管的、可自定義的 BuildKit 環境。

與預設的 Docker 驅動程式相比,使用 Docker 容器驅動程式有幾個優勢。例如:

概要

執行以下命令建立名為 container 的新構建器,該構建器使用 Docker 容器驅動程式

$ docker buildx create \
  --name container \
  --driver=docker-container \
  --driver-opt=[key=value,...]
container

下表描述了可以傳遞給 --driver-opt 的可用驅動程式特定選項

引數型別預設值描述
image字串設定用於容器的 BuildKit 映象。
memory字串設定容器可以使用的記憶體量。
memory-swap字串設定容器的記憶體交換限制。
cpu-quota字串對容器施加 CPU CFS 配額。
cpu-period字串設定容器的 CPU CFS 排程器週期。
cpu-shares字串配置容器的 CPU 共享 (相對權重)。
cpuset-cpus字串限制容器可以使用的 CPU 核心集。
cpuset-mems字串限制容器可以使用的 CPU 記憶體節點集。
default-load布林值false自動將映象載入到 Docker Engine 映象儲存中。
network字串設定容器的網路模式。
cgroup-parent字串/docker/buildx如果 Docker 使用 "cgroupfs" 驅動程式,設定容器的 cgroup 父級。
restart-policy字串unless-stopped設定容器的重啟策略
env.<key>字串在容器中將環境變數 key 設定為指定值 value

在配置容器的資源限制之前,請閱讀關於配置容器執行時資源約束的內容。

用法

執行構建時,Buildx 會拉取指定的 image(預設為 moby/buildkit)。容器啟動後,Buildx 會將構建提交到容器化的構建伺服器。

$ docker buildx build -t <image> --builder=container .
WARNING: No output specified with docker-container driver. Build result will only remain in the build cache. To push result image into registry use --push or to load image into docker use --load
#1 [internal] booting buildkit
#1 pulling image moby/buildkit:buildx-stable-1
#1 pulling image moby/buildkit:buildx-stable-1 1.9s done
#1 creating container buildx_buildkit_container0
#1 creating container buildx_buildkit_container0 0.5s done
#1 DONE 2.4s
...

快取永續性

docker-container 驅動程式支援快取永續性,因為它將所有 BuildKit 狀態和相關快取儲存到一個專用的 Docker 卷中。

為了即使在使用 docker buildx rmdocker buildx create 重新建立驅動程式後仍能持久化 docker-container 驅動程式的快取,可以使用 --keep-state 標誌銷燬構建器

例如,建立一個名為 container 的構建器,然後在持久化狀態的同時將其移除

# setup a builder
$ docker buildx create --name=container --driver=docker-container --use --bootstrap
container
$ docker buildx ls
NAME/NODE       DRIVER/ENDPOINT              STATUS   BUILDKIT PLATFORMS
container *     docker-container
  container0    desktop-linux                running  v0.10.5  linux/amd64
$ docker volume ls
DRIVER    VOLUME NAME
local     buildx_buildkit_container0_state

# remove the builder while persisting state
$ docker buildx rm --keep-state container
$ docker volume ls
DRIVER    VOLUME NAME
local     buildx_buildkit_container0_state

# the newly created driver with the same name will have all the state of the previous one!
$ docker buildx create --name=container --driver=docker-container --use --bootstrap
container

QEMU

docker-container 驅動程式支援使用 QEMU(使用者模式)來構建非原生平臺。使用 --platform 標誌指定要構建的架構。

例如,構建用於 amd64arm64 的 Linux 映象

$ docker buildx build \
  --builder=container \
  --platform=linux/amd64,linux/arm64 \
  -t <registry>/<image> \
  --push .

注意

使用 QEMU 進行模擬可能比原生構建慢得多,特別是對於編譯、壓縮或解壓等計算密集型任務。

自定義網路

你可以自定義構建器容器使用的網路。這在需要為構建使用特定網路時非常有用。

例如,讓我們建立一個網路,命名為 foonet

$ docker network create foonet

現在建立一個 docker-container 構建器,它將使用這個網路

$ docker buildx create --use \
  --name mybuilder \
  --driver docker-container \
  --driver-opt "network=foonet"

啟動並檢查 mybuilder

$ docker buildx inspect --bootstrap

檢查構建器容器,檢視正在使用哪個網路

$ docker inspect buildx_buildkit_mybuilder0 --format={{.NetworkSettings.Networks}}
map[foonet:0xc00018c0c0]

延伸閱讀

有關 Docker 容器驅動程式的更多資訊,請參閱buildx 參考

頁面選項