Cloud Native Buildpacks 只是一种执行多阶段容器镜像构建的自动方式吗?
Are Cloud Native Buildpacks just an automatic way to perform a multi-stage container image build?
我开始将 pack to build container images for my applications. I used different builders for different apps: gcr.io/buildpacks/builder for a Node.js app and paketobuildpacks/builder:tiny 用于 Clojure 应用程序。
不必编写 Docker 文件很棒,但我仍然不确定 Cloud Native Buildpacks 的工作原理。 buildpacks 只是一堆可执行文件(运行 由构建器实现)与开发人员手动编写 Docker multi-stage build(即多个 FROM
指令在一个Docker文件)?
有几个概念需要牢记
- 建筑工人。构建器由堆栈和一组或多组构建包组成。
- 堆栈是基础构建和 运行 图像。
- buildpack 是一个 OCI 映像,至少包含两个二进制文件,
detect
和 build
。
- 生命周期。生命周期负责运行所有构建器。
考虑到这一点,在高层次上,这就是发生的事情
当你运行pack build
。 cli 获取您的所有信息并使用它来执行构建。要进行构建,它将设置一个容器。容器使用堆栈中的构建镜像,其中包括来自构建器的构建包组,通常还包括一些专用于该镜像的开发库,以便更轻松地构建您的应用程序。然后它传递您通过 cli 输入的设置,运行 是该容器内的生命周期。
首先,生命周期将 运行 来自每个构建包的 detect
脚本。 detect
的输出是一个构建计划,生命周期使用它来 assemble 将参与构建的构建包列表。这就是 pack
cli 和最终生命周期可以构建 Java 应用程序、Node.js 应用程序或构建包支持的任何其他应用程序的方式。构建计划提供了有关需要哪些构建包来执行此操作的具体说明。
其次,生命周期将采用参与构建的构建包,这同样由 detect
和选定的构建计划决定,并且 运行 它们按顺序排列。每个 buildpack 然后 运行s 并执行构建应用程序所需的操作。具体会发生什么,取决于您的构建包,但构建包几乎可以做任何事情。 buildpack 运行ning 的最终结果是一组填充了信息和文件的层。
生命周期然后从构建器中获取 运行 图像,以及由 运行 构建包生成并标记为用于启动图像的所有层,并将它们组合到输出或启动图像中.
生命周期还处理存储构建和缓存层,以便后续构建能够利用并且 运行 更快。
Dockerfiles 还是 Buildpacks?
答案是非此即彼。每个工具都适合某些事情,您应该使用最好的工具来完成这项工作。
Buildpacks 的目标是拥有源代码并希望将其转换为 OCI 图像的开发人员。 Buildpack 消除了为此任务策划手工制作的手工 Dockerfile 的需要,让开发人员有更多时间编写更多代码并为他们的应用程序增加价值。
buildpacks 通过将为每种编程语言创建 OCI 图像的模式和最佳实践包装到一个封装的 well-tested 和 easy-to-use 使用工具中来实现这一点。
Dockerfile 往往更适合其他任务(即不打包您的应用程序),例如制作通用 OS 图像或打包数据库或消息队列等服务器。事实上,Buildpacks 使用 Dockerfiles 创建基础构建和作为构建器一部分的 运行 图像。
我开始将 pack to build container images for my applications. I used different builders for different apps: gcr.io/buildpacks/builder for a Node.js app and paketobuildpacks/builder:tiny 用于 Clojure 应用程序。
不必编写 Docker 文件很棒,但我仍然不确定 Cloud Native Buildpacks 的工作原理。 buildpacks 只是一堆可执行文件(运行 由构建器实现)与开发人员手动编写 Docker multi-stage build(即多个 FROM
指令在一个Docker文件)?
有几个概念需要牢记
- 建筑工人。构建器由堆栈和一组或多组构建包组成。
- 堆栈是基础构建和 运行 图像。
- buildpack 是一个 OCI 映像,至少包含两个二进制文件,
detect
和build
。 - 生命周期。生命周期负责运行所有构建器。
考虑到这一点,在高层次上,这就是发生的事情
当你运行pack build
。 cli 获取您的所有信息并使用它来执行构建。要进行构建,它将设置一个容器。容器使用堆栈中的构建镜像,其中包括来自构建器的构建包组,通常还包括一些专用于该镜像的开发库,以便更轻松地构建您的应用程序。然后它传递您通过 cli 输入的设置,运行 是该容器内的生命周期。
首先,生命周期将 运行 来自每个构建包的 detect
脚本。 detect
的输出是一个构建计划,生命周期使用它来 assemble 将参与构建的构建包列表。这就是 pack
cli 和最终生命周期可以构建 Java 应用程序、Node.js 应用程序或构建包支持的任何其他应用程序的方式。构建计划提供了有关需要哪些构建包来执行此操作的具体说明。
其次,生命周期将采用参与构建的构建包,这同样由 detect
和选定的构建计划决定,并且 运行 它们按顺序排列。每个 buildpack 然后 运行s 并执行构建应用程序所需的操作。具体会发生什么,取决于您的构建包,但构建包几乎可以做任何事情。 buildpack 运行ning 的最终结果是一组填充了信息和文件的层。
生命周期然后从构建器中获取 运行 图像,以及由 运行 构建包生成并标记为用于启动图像的所有层,并将它们组合到输出或启动图像中.
生命周期还处理存储构建和缓存层,以便后续构建能够利用并且 运行 更快。
Dockerfiles 还是 Buildpacks?
答案是非此即彼。每个工具都适合某些事情,您应该使用最好的工具来完成这项工作。
Buildpacks 的目标是拥有源代码并希望将其转换为 OCI 图像的开发人员。 Buildpack 消除了为此任务策划手工制作的手工 Dockerfile 的需要,让开发人员有更多时间编写更多代码并为他们的应用程序增加价值。
buildpacks 通过将为每种编程语言创建 OCI 图像的模式和最佳实践包装到一个封装的 well-tested 和 easy-to-use 使用工具中来实现这一点。
Dockerfile 往往更适合其他任务(即不打包您的应用程序),例如制作通用 OS 图像或打包数据库或消息队列等服务器。事实上,Buildpacks 使用 Dockerfiles 创建基础构建和作为构建器一部分的 运行 图像。