Docker 容器构建驱动程序
Docker 容器驱动程序允许在专用的 Docker 容器中创建一个可管理和可定制的 BuildKit 环境。
使用 Docker 容器驱动程序相较于默认的 Docker 驱动程序有几个优势。例如:
概述
运行以下命令以创建一个使用 Docker 容器驱动程序的新构建器,命名为 container:
$ docker buildx create \
--name container \
--driver=docker-container \
--driver-opt=[key=value,...]
container
以下表格描述了可用于传递给 --driver-opt 的可用驱动程序特定选项:
| 参数 | 类型 | 默认 | 描述 |
|---|---|---|---|
image | string | 设置用于容器的 BuildKit 镜像。 | |
memory | string | 设置容器可以使用的内存量。 | |
memory-swap | string | 为容器设置内存交换限制。 | |
cpu-quota | string | 对容器施加CPU CFS配额。 | |
cpu-period | string | 为容器设置CPU CFS调度程序周期。 | |
cpu-shares | string | 配置容器的CPU份额(相对权重)。 | |
cpuset-cpus | string | 限制容器可以使用的 CPU 核心集合。 | |
cpuset-mems | string | 限制容器可以使用的CPU内存节点集合。 | |
default-load | 布尔值 | false | 自动将镜像加载到 Docker 引擎镜像存储中。 |
network | string | 设置容器的网络模式。 | |
cgroup-parent | string | /docker/buildx | 设置容器的 cgroup 父项,如果 Docker 使用的是“cgroupfs”驱动程序。 |
restart-policy | string | unless-stopped | 设置容器的 重启策略。 |
env.<key> | string | 在容器中将环境变量 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 rm 和 docker 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 标志指定要为其构建的架构。
例如,为 amd64 和 arm64 构建 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 参考文档。