docker buildkit的前端和后端到底是什么?

kis*_*HoR 12 docker dockerfile docker-build docker-buildkit

我正在使用 Buildkit 探索 docker 构建过程。DOCKER_BUILDKIT=1我在调用之前通过在 CLI 上设置环境变量来启用它docker build。从 buildkit文档中可以看出,

  • 要使用外部 Dockerfile 前端,Dockerfile 的第一行需要指向# syntax=docker/dockerfile:1您要使用的特定映像。

从语法文档中可以看出,

  • 此功能仅在使用 BuildKit 后端时可用,并且在使用经典构建器后端时被忽略。

这个前端后端在 docker 构建过程中意味着什么?谁能帮助我简单地理解它?

vig*_*nah 20

太长了;前端和后端的概念是随着 Buildkit 诞生的,之前 docker 中并不存在。前端就像一个编译器,将用户的文件(例如:Dockerfile)转换为LLB。后端以最有效的方式执行LLB来构建docker镜像。

历史

如果没有 Buildkit,则可以使用 Dockerfile 中的指令直接构建 docker 映像。不会创建这些指令的中间表示。这些指令被传递到 docker 引擎(也称为 Moby 引擎或经典构建器),然后由该引擎构建镜像。

然后我们意识到,为了进一步改进和优化构建过程,构建操作的大部分基础知识都必须重新定义。因此,有人提议创建一个新的引擎,随着构建过程的前后端分离,Buildkit 诞生了。

buildkit 的主要设计目标之一是在构建过程中分离前端和后端问题。前端是为用户描述其构建定义而设计的。后端解决的问题是找到一种最有效的方法来解决前端为它们准备的构建操作的通用低级描述。

法学学士

前后端分离是通过LLB(low-level builder)来实现的。

有关构建的执行和缓存的所有内容仅在 LLB 中定义。

前端

前端是在 BuildKit 内运行的组件,并将任何构建定义(用户编写的文件)转换为 LLB。BuildKit 支持通过指定以下方式从容器映像动态加载前端:#syntax=...。一个著名的前端是 dockerfile 前端,因为它与 docker 引擎一起使用。您可以使用以下方式指定此容器映像: #syntax=docker/dockerfile:latest

还有很多其他可以使用的前端,例如带有以下内容的 mokerfile#syntax=r2d4/mocker前端:这样您就可以使用与通常的 Dockerfile 语法略有不同的语法。

后端

Buildkit 后端解决了从各种前端生成的LLB 。由于 LLB 是依赖图,因此可以对其进行处理以:检测并跳过执行未使用的构建阶段、并行化构建独立的构建阶段等。这就是 Buildkit 能够比旧构建过程提高性能、存储管理等的原因。此外,缓存模型已被完全重写。

构建器 (Buildkit) 的核心部分是一个求解器,它从前端获取低级构建 (LLB) 指令的 DAG,并找到一种以最有效的方式执行它们的方法,同时保留下一次调用的缓存。

要使用 Buildkit 后端,请指定DOCKER_BUILDKIT=1.

从版本 18.09 开始,Docker 支持由 moby/buildkit 项目提供的新后端来执行构建。

Moby 引擎(经典构建器)可以称为原始后端,但请记住它不使用 LLB,因此它的构建过程没有前端和后端。

参考资料和资源: