Docker 容器构建驱动程序

Docker 容器驱动程序允许创建托管和可自定义的 BuildKit 环境中。

与默认驱动程序相比,使用 Docker 容器驱动程序有几个优势 Docker 驱动程序。例如:

概要

运行以下命令以创建一个名为 的新生成器,该生成器使用 Docker 容器驱动程序:container

$ 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>字符串将环境变量设置为容器中的指定值。keyvalue

在为容器配置资源限制之前, 阅读有关为容器配置运行时资源约束的信息。

用法

当您运行构建时,Buildx 会拉取指定的(默认情况下为 moby/buildkit)。 当容器启动后,Buildx 将提交的构建提交到 容器化构建服务器。image

$ 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
...

缓存持久性

该驱动程序支持缓存持久性,因为它存储了所有 BuildKit 状态和相关缓存添加到专用的 Docker 卷中。docker-container

要保留驱动程序的缓存,即使在重新创建 驱动程序使用 和 ,您可以销毁 builder 使用标志:docker-containerdocker buildx rmdocker buildx create--keep-state

例如,要创建一个名为 builder,然后将其删除,而 持久状态: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

该驱动程序支持使用 QEMU(用户模式)构建非原生平台。使用标志指定 要为其构建的体系结构。docker-container--platform

例如,要为 和 构建 Linux 镜像:amd64arm64

$ 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

检查 builder 容器并查看正在使用的网络:

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

延伸阅读

有关 Docker 容器驱动程序的更多信息,请参阅 buildx 参考