
tonistiigi/buildkitBuildKit 是一个工具包,用于以高效、可表达且可重复的方式将源代码转换为构建产物。它提供了先进的构建能力,支持复杂的依赖管理、高效缓存和多格式输出,旨在替代传统构建工具,优化容器镜像及其他构建产物的构建流程。
docker build)以下命令将 buildkitd(守护进程)和 buildctl(客户端工具)安装到 /usr/local/bin:
bash# 编译并安装 $ make && sudo make install # 如需仅构建特定工作节点版本(如仅 containerd 或仅 OCI) $ make binaries-all # 生成 buildkitd.containerd_only 和 buildkitd.oci_only
bashbuildkitd --debug --root /var/lib/buildkit
--debug:启用调试日志--root:指定构建数据存储根目录(默认:/var/lib/buildkit)--oci-worker:启用/禁用 OCI (runc) 工作节点(默认:true)--containerd-worker:启用/禁用 containerd 工作节点(默认:false)BuildKit 支持两种工作节点后端:
切换至 containerd 后端:
bashbuildkitd --oci-worker=false --containerd-worker=true
BuildKit 构建基于名为 LLB(Low-Level Build)的二进制中间格式,用于定义构建过程中进程的依赖图。LLB 类似于 "Dockerfile 的 LLVM IR",具有以下特性:
LLB 格式定义见 solver/pb/ops.proto。目前支持的 LLB 高级语言包括 Dockerfile 及自定义语言(可通过 PR 添加)。
通过示例脚本生成并查看 LLB 构建图:
bash# 生成 LLB 定义并通过 jq 格式化输出 go run examples/buildkit0/buildkit.go | buildctl debug dump-llb | jq . # 执行构建(示例脚本支持 --with-containerd 标志添加 containerd 支持) go run examples/buildkit0/buildkit.go | buildctl build
示例脚本说明:
buildkit0:仅使用 exec 操作,为每个组件定义完整阶段buildkit1:分离 git 克隆步骤以提升并发度buildkit2:直接使用 git 源而非 git clone,优化性能和缓存buildkit3:支持本地源码路径(如 --runc=local)dockerfile2llb:将 Dockerfile 转换为 LLB(调试用)gobuild:演示嵌套调用生成 Go 包依赖的 LLB通过 dockerfile.v0 前端解析 Dockerfile:
bash# 基本构建(上下文和 Dockerfile 均为当前目录) buildctl build --frontend=dockerfile.v0 --local context=. --local dockerfile=. # 指定构建目标和构建参数 buildctl build \ --frontend=dockerfile.v0 \ --local context=. \ --local dockerfile=. \ --frontend-opt target=foo \ # 指定构建目标阶段 --frontend-opt build-arg:foo=bar # 传递构建参数
参数说明:
--frontend=dockerfile.v0:使用 Dockerfile 前端--local <name>=<path>:将本地路径暴露给构建器(context 为构建上下文,dockerfile 为 Dockerfile 路径)为简化 Dockerfile 构建,可使用 build-using-dockerfile 包装工具(语法类似 docker build):
bash# 编译并安装工具 go build ./examples/build-using-dockerfile && sudo install build-using-dockerfile /usr/local/bin # 基本构建 build-using-dockerfile -t myimage . # 指定 Dockerfile 路径和标签 build-using-dockerfile -t mybuildkit -f ./hack/dockerfiles/test.Dockerfile . # 构建后自动加载到 Docker docker inspect myimage
BuildKit 需通过导出器(Exporter)获取构建结果,支持以下导出方式:
需使用 containerd 工作节点:
bash# 导出镜像到 containerd buildctl build ... --exporter=image --exporter-opt name=docker.io/username/image # 查看 containerd 中的镜像 ctr --namespace=buildkit images ls
bashbuildctl build ... \ --exporter=image \ --exporter-opt name=docker.io/username/image \ # 镜像名称(含仓库地址) --exporter-opt push=true # 启用推送
注:如需认证,
buildctl会自动读取 Docker 配置文件(~/.docker/config.json)。
将构建产物直接复制到客户端本地目录(适用于非容器镜像构建):
bashbuildctl build ... --exporter=local --exporter-opt output=path/to/output-dir
通过 tarball 导出并加载到 Docker:
bash# 导出为 Docker 兼容 tarball 并加载 buildctl build ... --exporter=docker --exporter-opt name=myimage | docker load
bash# 导出到指定路径 buildctl build ... --exporter=oci --exporter-opt output=path/to/output.tar # 导出到标准输出 buildctl build ... --exporter=oci > output.tar
BuildKit 可通过容器运行 buildkitd 守护进程,并通过远程客户端访问。
bash# 启动 buildkitd 容器(特权模式,暴露 1234 端口) docker run -d --privileged -p 1234:1234 tonistiigi/buildkit --addr tcp://0.0.0.0:1234 # 配置客户端连接地址 export BUILDKIT_HOST=tcp://0.0.0.0:1234 # 验证客户端连接 buildctl build --help
注:
tonistiigi/buildkit镜像可通过本地构建生成,Dockerfile 路径:./hack/dockerfiles/test.Dockerfile。
bashbuildctl du -v # 查看缓存使用情况(-v 显示详细信息)
bashbuildctl debug workers -v # 查看工作节点状态(-v 显示详细信息)
BuildKit 支持通过 OpenTracing 追踪构建过程,以 Jaeger 为例:
bashdocker run -d -p 6831:6831/udp -p ***:*** jaegertracing/all-in-one:latest
bashexport JAEGER_TRACE=0.0.0.0:6831 # Jaeger 收集器地址
buildkitd 和 buildctl,构建任务将被追踪,可通过 [***] 查看追踪结果。BuildKit 测试使用的 runc 版本与 containerd 项目一致,详情参考 containerd 的 RUNC.md。
详情参考 docs/rootless.md。
bashmake test # 容器化环境中运行所有单元和集成测试
测试特定包:
bashmake test TESTPKGS=./client # 仅测试 client 包
运行特定测试(含工作节点组合):
bashmake test TESTPKGS=./client TESTFLAGS="--run /TestCallDiskUsage -v"
指定工作节点后端测试:
bash# 支持的后端:oci, oci-rootless, containerd, containerd-1.0 make test TESTPKGS=./client TESTFLAGS="--run //worker=containerd -v"
bash# 修改 vendor.conf 后更新依赖 make vendor
bashmake validate-all # 验证代码格式、依赖等




manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务