构建套件
概述
BuildKit 是一个改进的后端,用于替换旧版构建器。BuildKit 是默认构建器 适用于 Docker Desktop 和 Docker Engine (截至版本 23.0) 的用户。
BuildKit 提供了新功能并提高了构建的性能。 它还引入了对处理更复杂场景的支持:
- 检测并跳过执行未使用的构建阶段
- 并行构建独立的构建阶段
- 在构建之间仅增量传输构建上下文中已更改的文件
- 检测并跳过在构建上下文中传输未使用的文件
- 将 Dockerfile 前端实现与许多 新功能
- 避免 API 的其余部分(中间镜像和容器)的副作用
- 确定构建缓存的优先级以进行自动修剪
除了许多新功能外,BuildKit 的主要改进领域也比当前的 体验包括性能、存储管理和可扩展性。从 性能方面,一个重要的更新是新的完全并发构建图 求解。它可以尽可能并行运行构建步骤并进行优化 命令,这些命令对最终结果没有影响。我们还优化了 对本地源文件的访问。通过仅跟踪对这些 文件之间,无需等待本地 在工作开始之前要读取或上传的文件。
法学学士
BuildKit 的核心是低级构建 (LLB) 定义格式。LLB 是一种中间二进制格式 ,它允许开发人员扩展 BuildKit。LLB 定义了一个 content-addressable 可用于将非常复杂的构建组合在一起的依赖项图 定义。它还支持 Dockerfile 中未公开的功能,例如直接 数据挂载和嵌套调用。
有关生成执行和缓存的所有内容都在 LLB 中定义。这 与旧版构建器相比,缓存模型完全重写。而不是 使用启发式方法比较镜像,LLB 直接跟踪 build 的校验和 图形和内容挂载到特定作。这使得它更快, 更精确、更便携。构建缓存甚至可以导出到注册表, 其中,它可以通过任何主机上的后续调用按需提取。
LLB 可以直接使用 golang 客户端包生成,该客户端包允许定义 使用 Go 语言基元的 build作。这为您提供了完整的运行能力 任何你能想象到的,但可能不是大多数人会定义的东西 他们的构建。相反,大多数用户会使用前端组件或 LLB 嵌套 调用来运行一组准备好的构建步骤。
前端
前端是一个组件,它采用人类可读的构建格式,并将 it 转换为 LLB,以便 BuildKit 可以执行它。前端可以作为镜像分发, 用户可以定位前端的特定版本,该版本保证 为其定义使用的功能工作。
例如,要使用 BuildKit 中,您将使用外部 Dockerfile 前端。
开始
BuildKit 是 Docker Desktop 和 Docker Engine 上用户的默认构建器 v23.0 及更高版本。
如果您已经安装了 Docker Desktop,则无需启用 BuildKit。如果你 运行的 Docker Engine 版本低于 23.0,则可以启用 BuildKit,或者将 BuildKit 设为 守护程序配置中的默认设置。
要在运行docker build
命令,运行:
$ DOCKER_BUILDKIT=1 docker build .
注意
Buildx 始终使用 BuildKit。
要默认使用 Docker BuildKit,请在/etc/docker/daemon.json
,然后重新启动守护程序。
{
"features": {
"buildkit": true
}
}
如果/etc/docker/daemon.json
文件不存在,请创建名为daemon.json
,然后将以下内容添加到文件中。并重新启动 Docker
守护 进程。
Windows 上的 BuildKit
警告
BuildKit 仅完全支持构建 Linux 容器。 Windows 容器支持是实验性的,并在
moby/buildkit#616
.
BuildKit 从 0.13 版开始对 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 和 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.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
在 上安装 BuildKit Binaries
PATH
.# 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