【问题标题】:What exactly is the frontend and backend of docker buildkit?docker buildkit 的前端和后端到底是什么?
【发布时间】:2022-07-23 14:28:53
【问题描述】:

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

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

从语法documentation 来看,

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

这个 frontendbackend 在 docker 构建过程中意味着什么?谁能帮我简单理解一下?

【问题讨论】:

    标签: docker dockerfile docker-build docker-buildkit


    【解决方案1】:

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

    历史

    如果没有 Buildkit,则直接使用 Dockerfile 中的指令构建 Docker 映像。没有创建这些指令的中间表示。指令被传递给 docker 引擎(也称为 Moby 引擎或 classic builder),然后构建镜像。

    然后意识到,为了进一步改进和优化构建过程,构建操作的大部分基础都必须重新定义。于是,一个proposal被用来创建一个新的引擎,Buildkit随着构建过程的前后端分离而诞生。

    buildkit 的主要设计目标之一是在构建过程中分离前端和后端关注点。前端是为用户设计的用于描述其构建定义的东西。后端解决了寻找一种最有效的方法来解决构建操作的常见低级描述的问题,这些描述已由前端准备好。

    法学学士学位

    前后端分离由LLB(low-leve builder)实现。

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

    前端

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

    还有很多其他的前端可以使用,例如mockerfile 前端:#syntax=r2d4/mocker。与通常的 Dockerfile 语法相比,这允许您使用稍微不同的语法。

    后端

    Buildkit 后端解决各种前端生成的 LLB。由于 LLB 是一个依赖图,它可以被处理为:检测并跳过执行未使用的构建阶段,并行构建独立的构建阶段等。这就是为什么 Buildkit 能够在旧的构建过程中提高性能、存储管理等。此外,缓存模型已完全重写。

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

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

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

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

    参考资料和资源:

    【讨论】:

    • 感谢您的解释。这里有几个问题仍然令人困惑 1) 那么在 18.09 版本之前,docker 是否拥有一个前端组件(dockerfile.v0)来解析 Dockerfile 并提供给经典后端?如果是,它之前是否也产生 LLB 代码? 2)docker/dockerfile是我们在Dockerfile第一行写的网关前端。那么默认的 docker 前端图像是什么?
    • @KishorU,我已经修改了答案,使其更加清晰。我认为问题 1) 现在已在上面得到解答。 q
    猜你喜欢
    • 1970-01-01
    • 2012-01-15
    • 2017-12-02
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 2020-09-13
    相关资源
    最近更新 更多