问题描述
在DevOps中遇到了一个术语问题,他在Heroku平台上熟悉了构建包(buildpack)这个术语。但他不确定这是否是Heroku特定的术语,还是在DevOps中更广泛存在的术语?
当他在Google上搜索时,发现有很多关于构建包的文章并没有提到Heroku,所以他猜想这可能是一个更通用的术语。如果是这样的话,构建包到底是什么?它与Docker镜像有什么区别?或者它们是不同名称的相同东西吗?
解决方案
请注意以下操作注意版本差异及修改前做好备份。
构建包与Docker镜像
构建包和Docker镜像是两种不同的技术,但它们是相关的。构建包用于生成容器镜像,而Docker镜像则是容器镜像的一种类型。构建包和Docker镜像虽然不同,但它们之间存在关联。
构建包
构建包是一种通用的DevOps技术,至少现在是这样(你可以在下面的历史中了解原因)。构建包用于生成容器镜像,而不需要使用Docker或Dockerfile。构建包可以根据项目代码自动确定如何创建容器镜像并运行代码。例如,当项目代码中存在package.json文件时,构建包会自动应用Node.js构建包来构建容器镜像。这就是构建包的魔力所在。
Dockerfile
与构建包不同,Dockerfile通常由开发人员为每个应用程序创建。Dockerfile是一个文本文件,其中包含一系列指令,用于定义如何构建容器镜像。开发人员可以在Dockerfile中指定从哪个基础镜像开始构建,如何复制项目文件到容器中,如何安装依赖项,如何编译代码,以及如何定义运行应用程序的方式。Dockerfile的目标是创建一个特定状态的系统,并生成一个容器镜像。
构建包的历史
构建包最早由Heroku于2011年提出。自那时以来,它们已被Cloud Foundry和其他PaaS(如Google App Engine、Gitlab、Knative、Deis、Dokku和Drie)采用。
构建包的历史可以追溯到Heroku,但现在它已经成为一个更广泛的概念。当一个技术项目从多个公司分化成多个项目时,有时会有一个团队为我们提供一个单一的标准。这就是Cloud Native Buildpacks诞生的原因。Cloud Native Buildpacks项目于2018年1月由Pivotal和Heroku发起,并于2018年10月加入Cloud Native Computing Foundation。该项目旨在通过定义明确的平台到构建包的契约,统一构建包生态系统。Cloud Native Buildpacks采用了现代容器标准,如OCI镜像格式,并利用这些标准的最新功能,如在Docker API v2注册表上进行跨存储库的blob挂载和镜像层的”重定位”。
总结
构建包是一种通用的DevOps技术,用于生成容器镜像。它与Docker镜像是不同的技术,但它们之间存在关联。构建包可以根据项目代码自动确定如何创建容器镜像并运行代码,而Dockerfile是由开发人员手动创建的用于定义容器镜像构建过程的文件。构建包最早由Heroku提出,现在已成为一个更广泛的概念,并且有一个名为Cloud Native Buildpacks的项目来统一构建包生态系统。