moby/buildkit
运维与部署把源代码或 Dockerfile 高效、可并发地构建成容器镜像及其他产物的构建工具包。
项目介绍
BuildKit 是现代 Docker 构建背后的构建引擎,也被许多容器构建系统采用。它把 Dockerfile 或其他 frontend 的构建定义编译成中间格式 LLB,再调度执行。架构上分为运行在 Linux 上的守护进程 buildkitd 和客户端 buildctl,客户端还支持 macOS 和 Windows。
它主要解决两个问题:并发解析构建依赖,以及高效复用构建缓存。LLB 是厂商中立的 Protobuf 格式,因此构建不一定要用 Dockerfile 表达;HLB、Earthfile、Nix 等语言都有对应的 frontend。构建结果可以输出为镜像并推送到仓库、写入本地目录、导出 Docker 或 OCI tarball,或存入 containerd 的镜像存储。
快速使用
守护进程需要 Linux 主机,并安装 runc 或 crun,使用 containerd worker 时还需要 containerd。先以 root 用户启动:
sudo buildkitd
守护进程默认监听 Unix socket。要以非 root 用户运行,参见无 root 运行指南。然后在当前目录构建 Dockerfile:
buildctl build \
--frontend=dockerfile.v0 \
--local context=. \
--local dockerfile=.
默认情况下构建结果和中间缓存只保留在 BuildKit 内部,必须指定 output 才能取回结果。推送到镜像仓库:
buildctl build ... --output type=image,name=docker.io/username/image,push=true
若要复制到本地目录,改用 --output type=local,dest=path/to/output-dir。Linux、macOS 和 Windows 的预编译二进制文件见发布页面;macOS 还可以通过非官方 Homebrew formula 安装,但该 formula 不含守护进程,需要借助 Lima 等 Linux 虚拟机运行 buildkitd。
输出与缓存
输出需要显式选择。除了推送镜像和写本地目录,还可以导出 Docker 或 OCI tarball,或把镜像存入 containerd 镜像存储。使用 --metadata-file 可以输出镜像 digest 等构建元数据。
缓存也可以导出和导入。inline 导出器把缓存元数据嵌入推送的镜像;registry 导出器把镜像和缓存分开存储,并支持 max 模式。此外还有本地目录、GitHub Actions、S3 和 Azure Blob Storage 缓存导出器,后三者标注为实验性。多平台构建和集群内共享缓存有单独的文档说明。
使用约束
守护进程支持 Linux 和 Windows,客户端跨平台。容器化运行守护进程通常需要特权模式;rootless 镜像和 daemonless 模式可以避免部分特权要求,但各有自身条件。通过 TCP 暴露 gRPC API 时,如果不启用双向 TLS 会有明确风险,因为执行 RUN 的容器也能调用该 API。垃圾回收需要在守护进程配置文件中设置,本地缓存默认位于 /var/lib/buildkit。项目采用 Apache-2.0 许可证,贡献方式见贡献指南。
HotRepo 点评
BuildKit 在 2026-11-04 的 Go 日榜上以第 12 名出现,当天新增 2 星;对一个已有超过 1 万星的仓库来说,这个变化很小,符合成熟基础设施项目的状态:它的价值来自被 Docker、Buildx、Gitpod、Earthly 等采用,而不是星数增速。Hacker News 上的两条提交都是较窄的实践记录,其中一条评论指出构建卷支持早在 2019 年就已存在,说明讨论更多集中在加快流水线,而不是项目本身的热度。对需要规模化构建容器镜像的团队,值得关注的是缓存控制和输出灵活性,而不是近期榜单表现。
本文由 AI 根据项目 README 生成,更新于 ,以项目官方文档为准。