Docker BuildKit 是一个鲜为人知的功能,在 Docker 版本 19.03 及以后版本可用。BuildKit 支持更高性能的 docker 构建和缓存可能性,以减少构建时间并提高构建的性能和效率。
BuildKit 作为一项实验性功能,已经在 Docker 官方徘徊了很长一段时间。从 19.03 开始?,可以通过环境变量启用 BuildKit 功能,并释放其强大的性能。docker的创始人之一从docker离职创建dager专用于CICD领域,其dager的核心就是基于buildkit进行打包分发制品,可见buildkit的威力有多大。然而到现在还有好多人不甚了解buildkit,因此专门写本文来进行科普下。
背景:buildkit是用来做什么的?
当我们日常写完代码交付制品的时候,正常情况直接打包生成二进制或者脚本交付,使用docker后我们可以基于buildkit利用Dockerfile描述将文件系统打包为标准制品交付。单独看上图会发现buildkit占据的位置就是制品生成环节。然而看似简单的环节其实背后蕴藏了非常复杂的玄机,听我慢慢细说。
BuildKit 是 Moby 旗下的一个新项目,用于使用容器构建和打包软件。这是一个新的代码库,旨在替换 Moby 引擎中当前构建功能的内部结构。
标准的 Docker 构建命令在 Dockerfile 上串行执行构建,这意味着它一次读取并构建 Dockerfile 的每一行或每一层。启用 BuildKit 后,它允许并行构建处理,从而获得更好的性能和更快的构建时间。
buildkit的核心功能有以下几个:
- 自动垃圾收集
- 可扩展的前端格式
- 并发依赖解析
- 高效的指令缓存
- 构建缓存导入/导出
- 嵌套构建作业调用
- 分布式工人
- 多种输出格式
- 可插拔架构
- 无root权限执行
总而言之,BuildKit 具有更好的性能并使用docker build我们已经熟悉的相同界面。此外,BuildKit 支持在远程容器存储库(如 DockerHub)中使用缓存和存储缓存,以获得更好的构建性能,因为我们不必重建镜像的每一层。
看到这里相比大家已经大概知道buildkit是干什么用的了。
如何启用buildkit
由于 BuildKit 非常容易启用,我建议在任何地方启用以利用强大的功能。最好的起点是您的开发环境,以更好地了解其好处。BuildKit 将是一个令人愉快的升级,可以解锁更多构建图像的用例。
尽早开始并开始开发。立即启用 BuildKit 以了解它如何最好地与您的项目配合使用。这是一个简单的开始方式,然后您可以在您的开发环境中继续将 BuildKit 推进到 CI/CD 作为下一步。
在 CI/CD 管道中使用 BuildKit
现在我们了解了 BuildKit 的背景,让我们来看看为什么我们应该在 CI/CD 管道中启用 BuildKit。由于大多数可用的 CI/CD 工具,如 CircleCI、GitLab、TravisCI 等,都使用或可以使用 Docker 来管理你的工作。这是启用 BuildKit 的完美用例。
时间就是金钱,BuildKit 将有助于减少构建时间。
其效果不用我多说,我在几个项目上启用了 BuildKit,并不断将其推广到更多项目,并且已经看到使用 GitLab CI 在构建时间上有了巨大的改进。具体优化时间多少将根据您的 Dockerfile 的编写方式和 CI/CD 服务器的配置而有所不同。
即使您使用的是 CI/CD 工具的 SaaS 版本,您仍然可以为您的作业启用 BuildKit。
启用 BuildKit
可以通过两种不同的方式启用 BuildKit。只需设置环境变量或配置 Docker 守护进程以使用 BuildKit 作为所有构建的默认值,即可启用 BuildKit。BuildKit 仅适用于 Linux 和 macOS。
使用变量启用 BuildKit 的好处是您可能只想为环境或特定构建启用 BuildKit。通过 设置环境变量export DOCKER_BUILD=1。
要在运行构建时启用 BuildKit:
$ DOCKER_BUILDKIT=1 docker build .
另一种选择是通过添加到 Docker 守护进程来BuidKit设置为整个 Docker 主机的全局设置。BuildKit您可以通过两种不同的方式执行此操作。
- 直接编辑守护程序文件/etc/docker/daemon.json并添加以下内容
{
"experimental" : false,
"debug" : true,
"features":{
"buildkit" : true
}
}
2. 如果您使用 Docker for Mac,您可以直接通过 Docker 菜单进行开发。Docker for Mac Menu -> Preferences ->Daemon -> Advanced
将设置复制到 Docker Daemon 配置中,然后单击Apply & Restart。
不要再等了。立即启用 BuildKit!
开启完buildkit后下一步是什么?我推荐试试buildx
现在我们了解了 BuildKit 的好处,我们实际上可以进一步构建我们的构建。什么,进一步?是的,你没看错。
BuildX 听起来像是 Elon Musk 项目中的东西。但是,buildx是 BuildKit 的扩展,支持更多功能。buildx 仍处于实验阶段,但从我最初的测试到现在在生产中使用效果非常好,我仍在学习所有可能的功能。适合我的用例的最大功能是使用构建器来隔离构建环境并构建多架构镜像。
buildx 特性
- 熟悉的用户界面来自docker build
- 具有容器驱动程序的完整 BuildKit 功能
- 多个构建器实例支持
- 跨平台镜像的多节点构建
- 撰写构建支持
- WIP:高级构建构造 ( bake)
- TODO:容器内驱动程序支持