这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战
那为什么说这里是核心呢? 龙飞顿了顿,像是在整理思路。 是因为真正完成构建镜像的操作和对象都在这里面了
solver
像我们之前提到的,在buildkitd启动后,control接收到请求后,会初始化很多实例,其中solver就是在这个时候构建成功的,这里有一个关键点就是这步操作还实例化了jobs
jobs
jobs是由一个个的edge构建任务组成的,从复数来看,应该会有多个。
可能是以edge为单位,将DAG-有向无环图,里所有的边都作为一个任务来处理,这样就方便管理了,但带来的挑战就是如何高效组织和执行这些任务呢。
还没等龙飞接着往下说,袁小白就已经忍不住问道:不好意思,什么是DAG,图上也没看到啊。
哦,这个啊,我看到这里面出现了Vertex, Edge,这通常都是在图数据结构的上下文里,而通常如果要解析某一特定语言(DSL - Domain Specific Language)时,都会用到DAG(Directed Acyclic Graph),就像咱们大学里学的编泽原理里讲到的。
哦。 虽然一下子想不起来了,但好像是有提到。 袁小白回应到。
scheduler
刚才还说到编排任务呢。
这个scheduler就是干这个的,她会在jobs初始化的时候,就开始执行循环s.loop了,这样在edge相关的构建任务时,就可以dispatch分发出去了,由对应的edge实例去完成剩下的事情了。
bridge
那任务是由谁拆解的呢?
没错,正是bridge,当接收到解析请求llbBridge.Solve的时候,bridge会新建一个结果代newResultProxy理实例,这样就可以由这个代理去完成剩下的构建任务拆分了。
在loadResult的时候,加载vertex edge,这里是另一个关键点。
还记得前面client读取的是llb.definition,而这里取代的已经是vertex了,也就是说已经完成了转换。
再正式开始构建,传入的参数是edge,通过将任务加入到jobs中,由scheduler编排,最终由edge通过缓存策略shareOp.CacheMap来进行op的构建。
这里有点绕,我还是没听懂。 袁小白挠着头说道。
确实是的,如果想要了解的更详细,光看流程还是不够的,还得配合上数据结构,最好还有一些小例子。 现阶段先了解个大概,知道有这么回事就行了。 龙飞说。
是的,我们先了解个全貌,然后再进行拆分,一个模块一个模块的详细了解。 贾大智也说道。
下一篇:深入理解Moby Buildkit系列 #6 - Buildkitd流程闭环
知识点
用来记录一些出现的知识点,以后会把这些知识点展开来介绍。
- DAG, Vertex, Edge
- DSL