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 映象。
記憶體字串設定容器可以使用的記憶體量。
記憶體交換字串設定容器的記憶體交換限制。
CPU 配額字串對容器強制實施 CPU CFS 配額。
CPU 週期字串設定容器的 CPU CFS 排程器週期。
CPU 份額字串配置容器的 CPU 份額(相對權重)。
cpuset-cpus字串限制容器可以使用的 CPU 核心集合。
cpuset-mems字串限制容器可以使用的 CPU 記憶體節點集合。
預設載入布林值false自動將映象載入到 Docker Engine 映象儲存。
網路字串設定容器的網路模式。
cgroup-parent字串/docker/buildx如果 Docker 使用“cgroupfs”驅動,則設定容器的 cgroup 父級。
重啟策略字串unless-stopped設定容器的重啟策略
env.<鍵>字串在容器中將環境變數 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-container 驅動的快取,即使在使用 docker buildx rmdocker buildx create 重新建立驅動後,你也可以使用 --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 參考