BuildKit (original) (raw)
BuildKitis an improved backend to replace the legacy builder. BuildKit is the default builder for users on Docker Desktop, and Docker Engine as of version 23.0.
BuildKit provides new functionality and improves your builds' performance. It also introduces support for handling more complex scenarios:
- Detect and skip executing unused build stages
- Parallelize building independent build stages
- Incrementally transfer only the changed files in yourbuild context between builds
- Detect and skip transferring unused files in yourbuild context
- UseDockerfile frontend implementations with many new features
- Avoid side effects with rest of the API (intermediate images and containers)
- Prioritize your build cache for automatic pruning
Apart from many new features, the main areas BuildKit improves on the current experience are performance, storage management, and extensibility. From the performance side, a significant update is a new fully concurrent build graph solver. It can run build steps in parallel when possible and optimize out commands that don't have an impact on the final result. We have also optimized the access to the local source files. By tracking only the updates made to these files between repeated build invocations, there is no need to wait for local files to be read or uploaded before the work can begin.
At the core of BuildKit is aLow-Level Build (LLB) definition format. LLB is an intermediate binary format that allows developers to extend BuildKit. LLB defines a content-addressable dependency graph that can be used to put together very complex build definitions. It also supports features not exposed in Dockerfiles, like direct data mounting and nested invocation.
Everything about execution and caching of your builds is defined in LLB. The caching model is entirely rewritten compared to the legacy builder. Rather than using heuristics to compare images, LLB directly tracks the checksums of build graphs and content mounted to specific operations. This makes it much faster, more precise, and portable. The build cache can even be exported to a registry, where it can be pulled on-demand by subsequent invocations on any host.
LLB can be generated directly using agolang client package that allows defining the relationships between your build operations using Go language primitives. This gives you full power to run anything you can imagine, but will probably not be how most people will define their builds. Instead, most users would use a frontend component, or LLB nested invocation, to run a prepared set of build steps.
A frontend is a component that takes a human-readable build format and converts it to LLB so BuildKit can execute it. Frontends can be distributed as images, and the user can target a specific version of a frontend that is guaranteed to work for the features used by their definition.
For example, to build aDockerfile with BuildKit, you woulduse an external Dockerfile frontend.
BuildKit is the default builder for users on Docker Desktop and Docker Engine v23.0 and later.
If you have installed Docker Desktop, you don't need to enable BuildKit. If you are running a version of Docker Engine version earlier than 23.0, you can enable BuildKit either by setting an environment variable, or by making BuildKit the default setting in the daemon configuration.
To set the BuildKit environment variable when running the docker build
command, run:
Note
Buildx always uses BuildKit.
To use Docker BuildKit by default, edit the Docker daemon configuration in/etc/docker/daemon.json
as follows, and restart the daemon.
If the /etc/docker/daemon.json
file doesn't exist, create new file calleddaemon.json
and then add the following to the file. And restart the Docker daemon.
Warning
BuildKit only fully supports building Linux containers. Windows container support is experimental.
BuildKit has experimental support for Windows containers (WCOW) as of version 0.13. This section walks you through the steps for trying it out. We appreciate any feedback you submit byopening an issue here, especially buildkitd.exe
.
Known limitations
For information about open bugs and limitations related to BuildKit on Windows, seeGitHub issues.
Prerequisites
- Architecture:
amd64
,arm64
(binaries available but not officially tested yet). - Supported OS: Windows Server 2019, Windows Server 2022, Windows 11.
- Base images:
ServerCore:ltsc2019
,ServerCore:ltsc2022
,NanoServer:ltsc2022
. See thecompatibility map here. - Docker Desktop version 4.29 or later
Steps
Note
The following commands require administrator (elevated) privileges in a PowerShell terminal.
- Enable the Hyper-V and Containers Windows features.
If you seeRestartNeeded
asTrue
, restart your machine and re-open a PowerShell terminal as an administrator. Otherwise, continue with the next step. - Switch to Windows containers in Docker Desktop.
Select the Docker icon in the taskbar, and then Switch to Windows containers.... - Install containerd version 1.7.7 or later following the setup instructionshere.
- Download and extract the latest BuildKit release.
- Install BuildKit binaries on
PATH
. - Start the BuildKit daemon.
- In another terminal with administrator privileges, create a remote builder that uses the local BuildKit daemon.
Note
This requires Docker Desktop version 4.29 or later.
- Verify the builder connection by running
docker buildx inspect
.
The output should indicate that the builder platform is Windows, and that the endpoint of the builder is a named pipe. - Create a Dockerfile and build a
hello-buildkit
image. - Build and push the image to a registry.
- After pushing to the registry, run the image with
docker run
.