构建工具包
概述
BuildKit 是用于替代旧版构建器的改进后端。BuildKit 是 Docker Desktop 上用户的默认构建器,也是 Docker Engine 23.0 版本及更高版本的默认构建器。
BuildKit 提供了新的功能并提升了构建性能。 它还引入了对处理更复杂场景的支持:
- 检测并跳过执行未使用的构建阶段
- 并行构建独立的构建阶段
- 增量地仅在构建之间传输您构建上下文中的更改文件 构建上下文
- 检测并跳过传输构建上下文中的未使用文件 构建上下文
- 使用Dockerfile 前端实现,包含许多新功能
- 避免对API其余部分产生副作用(中间镜像和容器)
- 优先考虑构建缓存以进行自动修剪
除了许多新功能外,BuildKit 主要改进了当前体验的性能、存储管理和可扩展性。在性能方面,一个重大更新是全新的完全并发构建图求解器。当可能时,它可以并行运行构建步骤,并优化掉对最终结果没有影响的命令。我们还优化了对本地源文件的访问。通过仅跟踪在重复构建调用之间对这些文件所做的更新,无需等待本地文件读取或上传即可开始工作。
LLB
BuildKit 的核心是 低级构建 (LLB) 定义格式。LLB 是一种中间二进制格式, 允许开发者扩展 BuildKit。LLB 定义了一个内容可寻址的依赖图,可用于组合非常复杂的构建定义。它还支持 Dockerfile 中未暴露的功能,例如直接数据挂载和嵌套调用。
有关构建的执行和缓存的所有内容都在 LLB 中定义。与旧版构建器相比,缓存模型完全重写。LLB 不再使用启发式方法来比较镜像,而是直接跟踪构建图的校验和以及挂载到特定操作的内容。这使其更快、更精确且更便携。构建缓存甚至可以导出到注册表,后续在任何主机上的调用都可以按需拉取。
LLB 可以直接使用一个 golang 客户端包 生成,该包允许使用 Go 语言原语定义构建操作之间的关系。这赋予你运行任何你能想象到的操作的全部能力,但可能不会是大多数人定义构建的方式。相反,大多数用户将使用前端组件或嵌套的 LLB 调用来运行一组预先准备好的构建步骤。
前端
前端是一个组件,它将可读的构建格式转换为LLB,以便BuildKit可以执行。前端可以作为镜像分发,用户可以针对其定义使用的功能保证正常工作的前端特定版本。
例如,要使用 BuildKit 构建一个 Dockerfile,您将 使用外部的 Dockerfile 前端。
入门指南
BuildKit 是 Docker Desktop 和 Docker Engine v23.0 及更高版本用户的默认构建器。
如果您已安装 Docker Desktop,则无需启用 BuildKit。如果您正在运行的 Docker Engine 版本早于 23.0,可以通过设置环境变量或在守护程序配置中将 BuildKit 设置为默认设置来启用 BuildKit。
在运行 docker build
命令时设置 BuildKit 环境变量,请运行:
$ DOCKER_BUILDKIT=1 docker build .
注意
Buildx 总是使用 BuildKit。
要默认使用 Docker BuildKit,请编辑 Docker 守护程序配置在
/etc/docker/daemon.json 如下所示,并重启守护程序。
{
"features": {
"buildkit": true
}
}如果不存在 /etc/docker/daemon.json 文件,请创建一个名为 daemon.json 的新文件,然后将以下内容添加到该文件中。之后重启 Docker
守护进程。
在 Windows 上使用 BuildKit
警告
BuildKit 仅完全支持构建 Linux 容器。 Windows 容器支持处于实验阶段,相关信息请参阅
moby/buildkit#616。
自 0.13 版本起,BuildKit 对 Windows 容器(WCOW)提供实验性支持。
本节将引导您完成尝试步骤。
我们非常感谢您在此处提交的任何反馈
通过在此处打开问题,尤其是 buildkitd.exe。
已知限制
- 在 Windows 上,BuildKit 目前仅支持
containerd工作者。 对非 OCI 工作者的支持在 moby/buildkit#4836 中进行跟踪。
前提条件
- 架构:
amd64,arm64(提供Binaries但尚未进行官方测试)。 - 支持的操作系统:Windows Server 2019、Windows Server 2022、Windows 11。
- 基础镜像:
ServerCore:ltsc2019,ServerCore:ltsc2022,NanoServer:ltsc2022。 查看 兼容性地图在这里。 - Docker Desktop 4.29 或更高版本
步骤
注意
以下命令需要在 PowerShell 终端中使用管理员(提升)权限。
启用 Hyper-V 和 容器 Windows 功能。
> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V, Containers -All如果你看到
RestartNeeded被显示为True,请重启你的机器,并以管理员身份重新打开一个 PowerShell 终端。 否则,继续进行下一步。在 Docker Desktop 中切换到 Windows 容器。
在任务栏中选择 Docker 图标,然后 切换到 Windows 容器...。
安装版本为1.7.7或更高版本的containerd,按照此处的设置说明进行操作 here。
下载并解压最新的 BuildKit 发行版。
$version = "v0.13.1" # specify the release version, v0.13+ $arch = "amd64" # arm64 binary available too curl.exe -LO https://github.com/moby/buildkit/releases/download/$version/buildkit-$version.windows-$arch.tar.gz # there could be another `.\bin` directory from containerd instructions # you can move those mv bin bin2 tar.exe xvf .\buildkit-$version.windows-$arch.tar.gz ## x bin/ ## x bin/buildctl.exe ## x bin/buildkitd.exe在
PATH上安装 BuildKit Binaries。# after the binaries are extracted in the bin directory # move them to an appropriate path in your $Env:PATH directories or: Copy-Item -Path ".\bin" -Destination "$Env:ProgramFiles\buildkit" -Recurse -Force # add `buildkitd.exe` and `buildctl.exe` binaries in the $Env:PATH $Path = [Environment]::GetEnvironmentVariable("PATH", "Machine") + ` [IO.Path]::PathSeparator + "$Env:ProgramFiles\buildkit" [Environment]::SetEnvironmentVariable( "Path", $Path, "Machine") $Env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + ` [System.Environment]::GetEnvironmentVariable("Path","User")启动 BuildKit 守护进程。
> buildkitd.exe在另一个具有管理员权限的终端中,创建一个使用本地 BuildKit 守护程序的远程构建器。
注意
这需要 Docker Desktop 4.29 或更高版本。
> docker buildx create --name buildkit-exp --use --driver=remote npipe:////./pipe/buildkitd buildkit-exp通过运行
docker buildx inspect验证构建器连接。> docker buildx inspect输出应表明构建平台为 Windows, 并且构建器的端点为命名管道。
Name: buildkit-exp Driver: remote Last Activity: 2024-04-15 17:51:58 +0000 UTC Nodes: Name: buildkit-exp0 Endpoint: npipe:////./pipe/buildkitd Status: running BuildKit version: v0.13.1 Platforms: windows/amd64 ...创建一个Dockerfile并构建一个
hello-buildkit镜像。> mkdir sample_dockerfile > cd sample_dockerfile > Set-Content Dockerfile @" FROM mcr.microsoft.com/windows/nanoserver:ltsc2022 USER ContainerAdministrator COPY hello.txt C:/ RUN echo "Goodbye!" >> hello.txt CMD ["cmd", "/C", "type C:\\hello.txt"] "@ Set-Content hello.txt @" Hello from BuildKit! This message shows that your installation appears to be working correctly. "@构建并推送镜像到镜像仓库。
> docker buildx build --push -t <username>/hello-buildkit .在将镜像推送到注册表后,使用
docker run运行该镜像。> docker run <username>/hello-buildkit