BuildKit
概述
BuildKit 是一个改进的后端,用于替换旧版构建器。从 Docker Desktop 上的用户和 Docker Engine 23.0 版本开始,BuildKit 是默认的构建器。
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。如果您运行的是早于 23.0 版本的 Docker Engine,则可以通过设置环境变量或将 BuildKit 设置为守护程序配置中的默认设置来启用 BuildKit。
要在运行 `docker build` 命令时设置 BuildKit 环境变量,请运行
$ DOCKER_BUILDKIT=1 docker build .
注意Buildx 总是使用 BuildKit。
要默认使用 Docker BuildKit,请按如下方式编辑 `/etc/docker/daemon.json` 中的 Docker 守护程序配置,然后重新启动守护程序。
{
"features": {
"buildkit": true
}
}如果 `/etc/docker/daemon.json` 文件不存在,请创建一个名为 `daemon.json` 的新文件,然后将以下内容添加到该文件中。然后重新启动 Docker 守护程序。
Windows 上的 BuildKit
警告BuildKit 仅完全支持构建 Linux 容器。Windows 容器支持尚处于实验阶段。
BuildKit 从 0.13 版开始对 Windows 容器 (WCOW) 提供实验性支持。本节将引导您完成试用步骤。要提供反馈,请在仓库中提交问题,特别是 `buildkitd.exe`。
已知限制
有关 BuildKit 在 Windows 上开放错误和限制的信息,请参阅GitHub 问题。
先决条件
- 架构:`amd64`、`arm64`(二进制文件可用但尚未正式测试)。
- 支持的操作系统:Windows Server 2019、Windows Server 2022、Windows 11。
- 基础镜像:`ServerCore:ltsc2019`、`ServerCore:ltsc2022`、`NanoServer:ltsc2022`。请参阅此处兼容性图。
- Docker Desktop 4.29 或更高版本
步骤
注意以下命令需要在 PowerShell 终端中具有管理员(提升)权限。
启用 **Hyper-V** 和 **Containers** Windows 功能。
> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V, Containers -All如果看到 `RestartNeeded` 为 `True`,请重新启动机器并以管理员身份重新打开 PowerShell 终端。否则,继续执行下一步。
在 Docker Desktop 中切换到 Windows 容器。
选择任务栏中的 Docker 图标,然后选择 **Switch to Windows containers...**。
按照此处的设置说明安装 containerd 1.7.7 或更高版本。
下载并解压最新的 BuildKit 版本。
$version = "v0.22.0" # 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 二进制文件。
# 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注意如果您正在运行 *dockerd-managed* `containerd` 进程,请通过提供地址来使用它:`buildkitd.exe --containerd-worker-addr "npipe:////./pipe/docker-containerd"`
在另一个具有管理员权限的终端中,创建一个使用本地 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