如何将BuildPack打包成?
摘要:无需 dockerfile,使用 buildpacks 打包镜像 书接上文,聪明如你已经发现项目中没有定义 dockerfile,但我们依然能打镜像,是如何做到的呢?正如上面提到的 gradle 的 spring 插件创建了 bootBui
无需 dockerfile,使用 buildpacks 打包镜像
书接上文,聪明如你已经发现项目中没有定义 dockerfile,但我们依然能打镜像,是如何做到的呢?正如上面提到的 gradle 的 spring 插件创建了 bootBuildImage,通过 buildpacks 构建 OCI 镜像。
概念
buildpacks 让你可以把源文件转换为安全、高效、预生产的容器镜像。
buildpacks 是什么?
buildpacks 为应用程序提供框架和运行时支持。buildpacks 检查你的应用以决定需要哪些依赖,并恰当的配置这些应用以便能在各种云环境中运行。
工作方式
每个 buildpack 由两个阶段组成。
检测(detect)阶段
检测阶段会检查你的源码是否适合使用 buildpack。如果适合,就直接进入构建(build)阶段。如果不适合,则直接跳过 buildpack 中的构建阶段。
例如:
buildpack 如何在 Python 项目中找到 requirements.txt 或 setup.py 文件,则通过检测
buildpack 如果在 Node 项目中找到 package-lock.json 文件,则通过检测
构建(build)阶段
构建阶段会检测你的代码以完成以下操作:
设置构建时和运行时环境
下载依赖然后编译你的源码(如果有必要的话)
设置恰当的程序入口和启动脚本
例如:
Python 项目中的 buildpack 如果检测到 requirements.txt 文件,会执行 pip install -r requirements.txt 命令,以安装 requirements.txt 文件中的依赖。
Node 项目中的 buildpack 如果检测到 package-lock.json 文件,会执行 npm install 命令。
构建者是什么样子?
构建者是多个 buildpack 文件、基础构建(build)镜像、运行(run)镜像的有序组合。这些构建者参与到你的源码中然后构建,输出 app 镜像。构建镜像为构建者提供基础环境(例如,一个带有构建工具的 Ubuntu Bionic 操作系统镜像),运行镜像为 app 镜像在运行期间提供基础环境。构建镜像和运行镜像的组合叫做栈。
究其根本,构建者使用生命周期(lifecycle)为所有 buildpack 运行检测阶段,以便为所有通过检测阶段的 buildpack 运行构建阶段。
这让我们可以通过一个构建者就可以自动检测和构建各种各样的应用程序。
例如,假如 demo-builder 包含 Python 和 Node buildpack。那么
如果你的项目只包含 requirements.txt 文件,demo-builder 将只运行 Python 构建步骤。
如果你的项目只包含 package-lock.json 文件,demo-builder 将只允许 Node 构建步骤。
如果你的项目同时包含 package-lock.json 和 requirements.txt 文件,demo-builder 将同时运行 Python 和 Node 构建步骤。
如果你的项目既不包含 requirements.txt 文件,也不包含 package-lock.json 文件,那么 demo-builder 将检测失败,并退出构建。
组件
构建者
构建者是什么?
构建者是一个包含执行构建时需要的各种组件的镜像。构建者镜像由构建镜像、生命周期、多个 buildpack、各方面的构建配置文件(包含 buildpack 检测顺序和运行镜像的位置)组成。
解剖构建者
构建者由以下组件组成:
多个 buildpack
生命周期
栈构建镜像
buildpack
buildpack 是什么?
buildpack 是一个工作单元,该工作单元仔细检查你的源代码然后制定构建、运行应用程序的计划。
通常多个 buildpack 文件是一个至少包含 3 个文件的集合:
buildpack.toml——提供 buildpack 的元数据
bin/detect——决定是否可以应用 buildpack
bin/build——执行 buildpack 逻辑
元 buildpack
还有一种不同类型的 buildpack,通常称为元 buildpack。它只有一个 buildpack.toml 文件,该文件包含有序的配置,而配置的内容是对其它 buildpack 的引用。当组合比较复杂的检测策略时,元 buildpack 特别有用。
