有几个概念要记住
- 一个建设者。构建器由一个堆栈和一组或多组构建包组成。
- 堆栈是基本构建和运行映像。
- buildpack 是一个包含至少两个二进制文件的 OCI 映像,
detect
并且build
.
- 生命周期。负责运行所有构建器的生命周期。
考虑到这一点,在高层次上,这就是发生的事情
当你运行pack build
. cli 获取您的所有信息并使用它来执行构建。要进行构建,它将设置一个容器。容器使用堆栈中的构建映像,其中包括来自构建器的构建包组,通常还有一些专用于该映像的开发库,以使构建应用程序更容易。然后它传递您通过 cli 输入的设置并在该容器内运行生命周期。
首先,生命周期detect
将从每个 buildpack 运行脚本。的输出detect
是一个构建计划,生命周期使用它来组装将参与构建的构建包列表。这就是pack
cli 和最终的生命周期如何构建 Java 应用程序、Node.js 应用程序或任何其他受 buildpacks 支持的东西。构建计划提供了关于需要哪些构建包来执行此操作的具体说明。
其次,生命周期将采用参与构建的构建包,这也是由detect
所选构建计划确定的,并按顺序运行它们。然后每个 buildpack 运行并执行构建应用程序所需的操作。究竟会发生什么,取决于您的 buildpack,但 buildpack 几乎可以做任何事情。buildpack 运行的最终结果是一组填充了信息和文件的层。
然后,生命周期从构建器获取运行映像以及由运行并标记为发往启动映像的构建包生成的所有层,并将它们组合到输出或启动映像中。
生命周期还处理存储构建和缓存层,以便后续构建能够利用并更快地运行。
Dockerfiles 还是 Buildpacks?
答案是它不是一个或另一个。每个工具都适用于某些事情,你应该使用最好的工具来完成这项工作。
Buildpacks 针对拥有源代码并希望将其转换为 OCI 映像的开发人员。Buildpacks 消除了为这项任务策划手工制作的、手工的 Dockerfile 的需要,从而使开发人员可以腾出时间编写更多代码并为他们的应用程序增加价值。
构建包通过将用于为每种编程语言创建 OCI 映像的模式和最佳实践封装到一个封装的、经过良好测试且易于使用的工具中来实现这一点。
Dockerfile 往往更适合其他任务(即不打包您的应用程序),例如制作通用操作系统映像或打包数据库或消息队列等服务器。事实上,Buildpacks 使用 Dockerfiles 来创建作为构建器一部分的基本构建和运行镜像。