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>细绳将环境变量设置keyvalue容器中指定的值。

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

用法

当您运行构建时,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驱动程序不同,使用驱动程序构建的映像 docker-container必须显式加载到本地映像存储中。使用--load标志:

$ docker buildx build --load -t <image> --builder=container .
...
 => exporting to oci image format                                                                                                      7.7s
 => => exporting layers                                                                                                                4.9s
 => => exporting manifest sha256:4e4ca161fa338be2c303445411900ebbc5fc086153a0b846ac12996960b479d3                                      0.0s
 => => exporting config sha256:adf3eec768a14b6e183a1010cb96d91155a82fd722a1091440c88f3747f1f53f                                        0.0s
 => => sending tarball                                                                                                                 2.8s
 => importing to docker

构建完成后,该映像将在映像存储中可用:

$ docker image ls
REPOSITORY                       TAG               IMAGE ID       CREATED             SIZE
<image>                          latest            adf3eec768a1   2 minutes ago       197MB

缓存持久化

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标志指定您要为其构建的架构。

例如,要为amd64和构建 Linux 映像arm64

$ 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 参考