BuildKit

概述

BuildKit 是一个改进的后端,用于替换旧的构建器。BuildKit 是 Docker Desktop 用户和 Docker Engine 23.0 版本及以后的默认构建器。

BuildKit 提供了新功能并提高了构建性能。 它还引入了对处理更复杂场景的支持:

  • 检测并跳过执行未使用的构建阶段
  • 并行化构建独立的构建阶段
  • 在构建之间仅增量传输构建上下文中更改的文件
  • 检测并跳过传输未使用的文件在您的 构建上下文
  • 使用 Dockerfile 前端 实现,包含许多 新功能
  • 避免与API的其他部分产生副作用(中间镜像和容器)
  • 优先考虑您的构建缓存以进行自动修剪

除了许多新功能外,BuildKit 在性能、存储管理和可扩展性方面对当前体验进行了改进。从性能方面来看,一个重要的更新是一个新的完全并发的构建图解析器。它可以在可能的情况下并行运行构建步骤,并优化掉对最终结果没有影响的命令。我们还优化了对本地源文件的访问。通过仅跟踪在重复构建调用之间对这些文件所做的更新,无需等待本地文件被读取或上传即可开始工作。

LLB

BuildKit 的核心是 低级构建 (LLB) 定义格式。LLB 是一种中间二进制格式, 允许开发者扩展 BuildKit。LLB 定义了一个内容可寻址的 依赖图,可用于构建非常复杂的构建 定义。它还支持 Dockerfiles 中未公开的功能,例如直接 数据挂载和嵌套调用。

关于构建的执行和缓存的一切都在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 中跟踪。

BuildKit 从版本 0.13 开始对 Windows 容器 (WCOW) 提供了实验性支持。 本节将引导您完成尝试它的步骤。 我们非常感谢您通过 在此处提交问题 提交的任何反馈,特别是关于 buildkitd.exe 的反馈。

已知限制

  • BuildKit 在 Windows 上目前仅支持 containerd 工作器。 对非 OCI 工作器的支持正在跟踪中 moby/buildkit#4836.

先决条件

  • 架构:amd64, arm64(二进制文件可用但尚未正式测试)。
  • 支持的操作系统:Windows Server 2019, Windows Server 2022, Windows 11.
  • 基础镜像:ServerCore:ltsc2019, ServerCore:ltsc2022, NanoServer:ltsc2022. 参见 兼容性地图.
  • Docker Desktop 版本 4.29 或更高版本

步骤

注意

以下命令需要在PowerShell终端中具有管理员(提升)权限。

  1. 启用Hyper-VContainers Windows功能。

    > Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V, Containers -All
    

    如果你看到 RestartNeededTrue,请重启你的机器并以管理员身份重新打开一个 PowerShell 终端。 否则,继续下一步。

  2. 在Docker Desktop中切换到Windows容器。

    选择任务栏中的Docker图标,然后切换到Windows容器...

  3. 按照设置说明安装containerd版本1.7.7或更高版本 这里

  4. 下载并解压最新的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
  5. 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")
  6. 启动BuildKit守护进程。

    > buildkitd.exe
    
  7. 在另一个具有管理员权限的终端中,创建一个使用本地BuildKit守护进程的远程构建器。

    注意

    这需要Docker Desktop版本4.29或更高版本。

    > docker buildx create --name buildkit-exp --use --driver=remote npipe:////./pipe/buildkitd
    buildkit-exp
    
  8. 通过运行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
    ...
  9. 创建一个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.
    "@
    
  10. 构建并将镜像推送到注册表。

    > docker buildx build --push -t <username>/hello-buildkit .
    
  11. 推送到注册表后,使用docker run运行镜像。

    > docker run <username>/hello-buildkit