
tonistiigi/dockerfile和后端执行引擎,旨在优化构建流程的性能、可缓存性和灵活性。
以下命令将 buildkitd(守护进程)和 buildctl(客户端工具)安装到 /usr/local/bin:
bash# 编译并安装 $ make && sudo make install # 如需仅构建特定工作节点版本,可使用 $ make binaries-all # 生成 buildkitd.containerd_only 和 buildkitd.oci_only
bashbuildkitd --debug --root /var/lib/buildkit
buildkitd 支持两种工作节点后端:
配置示例:
bash# 使用 containerd 后端(禁用 OCI 后端) buildkitd --debug --root /var/lib/buildkit --oci-worker=false --containerd-worker=true
LLB(Low-Level Build)是 BuildKit 的二进制中间格式,用于定义构建过程中进程的依赖图。类比:LLB 之于 Dockerfile,如同 LLVM IR 之于 C 语言。
目前已实现的 LLB 高级语言前端:
BuildKit 通过前端组件将 Dockerfile 转换为 LLB。默认使用 dockerfile.v0 前端,未来将支持外部镜像提供的前端。
基本构建命令
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 context=.:将当前目录作为构建上下文暴露给构建器--local dockerfile=.:指定 Dockerfile 所在目录兼容 docker build 的包装工具
对于熟悉 docker build 命令的用户,可使用示例包装工具 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 . # 构建并标记镜像 myimage # 指定 Dockerfile 路径 $ build-using-dockerfile -t mybuildkit -f ./hack/dockerfiles/test.Dockerfile . # 构建结果自动加载到 Docker $ docker inspect myimage # 查看构建后的镜像
默认情况下,构建结果仅保存在 BuildKit 内部,需通过导出器指定输出方式。
需使用 containerd 工作节点:
bashbuildctl build ... --exporter=image --exporter-opt name=docker.io/username/image # 查看导出的镜像 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
bash# 导出为 Docker 兼容的 tar 包并加载到 Docker 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
bashbuildctl du -v # -v 显示详细信息
bashbuildctl debug workers -v # 显示工作节点类型、状态等信息
可通过 Docker 容器运行 buildkitd,并远程访问。客户端 buildctl 支持 macOS 和 Windows。
bash# 启动容器,映射端口 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 本地构建:
bashdocker build -f ./hack/dockerfiles/test.Dockerfile -t local-buildkit .
| 参数 | 说明 |
|---|---|
--debug | 启用调试日志 |
--root <path> | 指定数据根目录(默认:/var/lib/buildkit) |
--oci-worker <bool> | 是否启用 OCI(runc)工作节点(默认:true) |
--containerd-worker <bool> | 是否启用 containerd 工作节点(默认:false) |
--addr <address> | 监听地址(如 tcp://0.0.0.0:1234,用于远程访问) |
| 参数 | 说明 |
|---|---|
--frontend <name> | 指定前端(如 dockerfile.v0) |
--local <name>=<path> | 暴露本地目录给构建器(如 context=.、dockerfile=.) |
--exporter <type> | 指定导出器类型(image、local、docker、oci 等) |
--exporter-opt <key>=<val> | 导出器选项(如 name=myimage、output=./dist、push=true) |
--frontend-opt <key>=<val> | 前端选项(如 target=stage、build-arg:foo=bar) |
| 环境变量 | 说明 |
|---|---|
BUILDKIT_HOST | 指定 buildkitd 守护进程地址(如 tcp://0.0.0.0:1234) |
JAEGER_TRACE | OpenTracing 收集地址(如 0.0.0.0:6831,用于链路追踪) |
BuildKit 支持 OpenTracing,用于追踪 buildkitd gRPC API 和 buildctl 命令。以 Jaeger 为例:
bashdocker run -d -p 6831:6831/udp -p ***:*** jaegertracing/all-in-one:latest
bash# 设置追踪地址 export JAEGER_TRACE=0.0.0.0:6831 # 重启 buildkitd 和 buildctl,构建操作将被追踪 # 访问 [***] 查看追踪数据
BuildKit 支持无 root 权限运行,详细配置见 docs/rootless.md。
开发过程中,BuildKit 测试基于 containerd 仓库使用的 runc 版本。详见 runc.md。
bash# 运行所有单元测试和集成测试(容器化环境) make test # 测试指定包 make test TESTPKGS=./client # 运行特定测试(带详细日志) make test TESTPKGS=./client TESTFLAGS="--run /TestCallDiskUsage -v" # 指定工作节点运行集成测试(支持:oci、oci-rootless、containerd、containerd-1.0) make test TESTPKGS=./client TESTFLAGS="--run //worker=containerd -v"
bash# 修改 vendor.conf 后更新依赖 make vendor
bash# 执行代码格式、lint、测试等全量验证 make validate-all


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