CloudFoundry中buildpack介绍与自定义实践

背景

用一个问题开篇:一个服务能够run起来,到底需要些什么?

做过部署系统的同学会对这个问题认识比较深,总结一下,我们可以归为如下几类:

1、程序本身的代码文件,嗯,这个不用解释

2、需要的配置,比如测试环境下有一套配置,开发环境、线上环境各有一套配置,还有甚者,一个idc一套配置

3、环境依赖,比如语言环境:Python2.7、JDK6,一些操作系统特性等

4、运行时依赖,比如我需要上游某个模块提供的rpc接口的支持,需要用到MQ等等

看起来,要部署个程序还是比较麻烦的嘞,那怎么做才会相对容易一些呢?如果程序最后能把所有依赖的东西打成一个包(比如统一要求是tar.gz格式),扔到任何一个地方去,我们只需要解压,然后使用解压出来的start.sh即可启动执行,那就太棒了!

 

buildpack就是解决这个问题的……

 

相关术语

在CloudFoundry中,最后打成的那个tar.gz的包,称为droplet,任何一个DEA拿到这个droplet,解压然后start即可。那具体应该如何打包?打包过程应该是运行一系列的脚本吧,这个脚本在哪里?一般来讲,脚本文件为了备份和版本化需求我们一般会放到git或svn上,嗯,现在可以解释什么叫buildpack了:它是一坨脚本,一般是放到git上作为一个project的形态存在,这坨脚本的作用是把用户写好的程序(CloudFoundry中一般称为app)、及其依赖的环境、配置、启动脚本等打包成droplet,这个过程称之为stage。

 

工作流介绍

app开发人员在命令行调用cf push之后,流程是如何走的,经过哪些步骤,在什么时候开始stage,完事之后又经历了什么,可以查看 cf push之后到底发生了什么:

 

buildpack目录结构

buildpack是工作在CloudFoundry这个大框架下的,我们知道,但凡工作在框架下的东西就要尊从一些规范,这是框架和你交互协调的根基。buildpack也不例外,CloudFoundry要求,buildpack至少含有一个bin目录,bin目录下有三个文件,文件名固定,分别是:

detect # 这个文件的作用是侦测你的项目,比如是个Java项目 or php项目,用的什么Runtime和Framework之类的

compile # 这是buildpack的核心文件,一般作用就是去拉取相应的Runtime(e.g. python2.7/ruby1.9.3)下来,做一下配置放到指定位置,拉取相应的Framework(e.g. Flask/Django)下来,做一下配置,放到指定位置

release # 这个文件最终要求输出一个yaml,来描述如何启动app之类的

三个脚本由Cloudfoundry顺次执行

 

如果编写buildpack过程需要创建其他文件夹或文件,其位置怎么安排都可以,CloudFoundry框架方面没有什么限制

 

自定义buildpack实例

下面我们自定义一个buildpack来支持java web项目,使用JDK7和tomcat7来跑,jdk和tomcat都要从公司内网来下载,版本可以稍微放宽,支持jdk6、7、8,tomcat也可以支持多个版本

detect内容大致如下:

#!/usr/bin/env bash
# cf 会给detect脚本传入一个参数,即build dir,里边就是那一坨app散文件
BUILD_DIR=$1
# 既然是java web的项目,而且跑在tomcat上,我们没别的要求,只要web.xml位于规范位置即可
if [ -d "${BUILD_DIR}/WEB-INF" ] && [ -f "${BUILD_DIR}/WEB-INF/web.xml" ]; then
# 按照惯例,一般会把所侦测到的项目类型echo出来,
# 这个echo出来的字符串和compile、release脚本没有半毛钱关系
echo "JavaWeb"
# 返回0表示detect成功执行,cf会继续执行compile,返回非0值cf就不继续往下走了
exit 0
fi
echo "no"
exit 1

 

compile文件做的事情稍微复杂一些,如果觉得bash不能胜任,随便用什么脚本语言来搞都OK,cf为compile脚本传入了两个参数:build dir和cache dir,build dir与传给detect文件的内容一致,cache dir是一个临时目录,比如我们在compile过程中下载jdk和tomcat之类的,就可以用cache dir做个中转。

#! /usr/bin/env ruby
# detect、compile、release这几个文件都没有后缀,用你喜欢的语言就好,这里是用的ruby
$stdout.sync = true
# 自己创建了一个lib目录,塞入环境变量,
# 如之前所述,除了bin目录必须固定之外,其他文件(夹)随你喜欢来安排
$:.unshift File.expand_path('../../lib', __FILE__)
require 'global'
require 'main_pack'
require 'fileutils'

build_path = ARGV[0]
cache_path = ARGV[1]
FileUtils.mkdir_p(build_path)
FileUtils.mkdir_p(cache_path)
# 主要逻辑都放在MainPack里了,无非就是下载、配置
pack = MainPack.new(Global.new(build_path, cache_path))
pack.compile

 

注意:

1、为了提高下载速度,免受网络困扰,同时增加掌控力度,我们一般会把依赖的tar包放到内网某个位置去自己管理

2、build_dir/.profile.d/*.sh文件都会在运行app之前由CloudFoundry帮我们提前运行,那在此导出一些环境变量之类的就比较方便了

 

release文件的内容大体为:

#!/usr/bin/env ruby

require 'yaml'

yml = {
'addons' => [],
'config_vars' => {},
'default_process_types' => {
'web' => './bin/catalina.sh run'
}
}.to_yaml

puts yml

 

 

default_process_types字段下面的web字段的值就是告诉CloudFoundry如何启动这个app,当然,我们可以在push应用的时候覆盖这个配置,稍候介绍~

 

如何使用自定义buildpack

这个很easy,进入app所在的目录,push即可:

cd /path/to/your/app
cf push --buildpack git://git.xiaomi.com/cf/cf-bp-javaweb-tomcat --command ./start.sh

 

 --buildpack就是用来指定自定义buildpack地址的,--command是用来指定自定义启动命令的,如果你的启动脚本是在app根目录下的start.sh,那就可以用上面的这条命令来push应用

 

坑

1、bin目录下的detect、compile、release三个文件要求本身有可执行权限,cf不会给你chmod +x,所以我们需要在放到git中的时候就要求有可执行权限

2、stage的时候,cf把我们的app文件放到了这里:/tmp/staged/app,运行时放到了这里:/home/vcap/app,是的,你没看错,二者目录不同,这就需要注意了,特别是安装一些lib组件的时候,当时为了支持python的buildpack就搞的比较恶心,需要安装setuptools、pip和gunicorn,最后是放在了程序启动前来做的,而不是compile阶段

3、在支持嵌入式jetty程序的时候,如果你用了WebAppContext可能也会有问题,没有任何提示信息,就是死活起不来,后来追查发现jetty会为WebAppContext自动创建一个临时目录,猜测可能是没有创建成功,至于为啥没成功一直没有追出来,最后的方案是在程序启动之前提前创建好这个临时目录:mkdir -p /home/vcap/app/work,你如果搞出来了来留言分享一下吧 :)

4、如果你的CloudFoundry跟我们一样没有采用bosh管理,很可能rootfs里缺少一些unzip之类的命令,这个也会使stage失败,提前把一些常用的工具命令装到rootfs里是个明智的选择

 

示例

1、javaweb的buildpack,使用tomcat作为web容器:

http://git.oschina.net/cnperl/cloudfoundry-custom-buildpack-javaweb-tomcat.git

2、支持python的buildpack:

http://git.oschina.net/cnperl/cloudfoundry-custom-buildpack-python.git

 

结语

总体来看,buildpack帮助paas平台完成了一个app在部署层面的抽象,主要搞定app依赖的runtime和framework,相当于搞定了静态依赖。操作系统特性通过统一定制rootfs来搞,不在buildpack问题域,配置文件差异问题,buildpack认为一个app一套配置,上层怎么处理,开发人员自己说了算,可以搭建多套CloudFoundry或者创建不同的app:dev-app/prod-app之类;运行时依赖也需要开发人员自己搞定,提前确认好相应的依赖是否已经在run,版本是否OK之类。

 

有任何问题欢迎留言讨论,谢谢支持 :)

 

CloudFoundry基础知识学习 1     CloudFoundry简介 CloudFoundry是VMware旗下子公司Pivotal的一款开源PaaS产品,是一个由多个独立子系统组成的分布式系统,能偶支持多种运行时环境、开发语言、框架及服务,可以构建于IaaS平台之上,也可以直接部署于物理机器上,总共有两个版本分别是V1和V2,V2版本采用的更为成熟的架构思想,引入了如Buildpack、Warden等强大灵活的组件。 阅读详情

相关推荐

java-buildpack:用于运行Java应用程序的Cloud Foundry buildpack

Cloud Foundry Java构建包 java-buildpack是用于运行基于JVM的应用程序的构建包。 它旨在运行许多基于JVM的应用程序( , ,Java Main, , 和Servlet),而无需其他配置,但支持标准组件的配置以及添加自定义组件的扩展。 用法 要使用此buildpack,在将应用程序推送到Cloud Foundry时指定存储库的URI: $ cf push < APP> -p < ARTIFACT> -b https://github.com/cloudfoundry/java-buildpack.git 例子 以下是部署我们支持的工件类型的非常简单的示例。 配置和扩展 可以使用与要覆盖的配置文件相匹配的环境变量(减去.yml扩展名)和前缀JBP_CONFIG来覆盖buildpack的默认配置。 不可能添加新的配置属性,并且nil或空

BuildPack:无需编写 Dockerfile,新一代的企业镜像打包工具

公众号关注「奇妙的 Linux 世界」设为「星标」,每天带你玩转 Linux !过去的工作中,我们使用微服务、容器化以及服务编排构建了技术平台。为了提升开发团队的研发效率,我们同时还提供了 CICD 平台,用来将代码快速的部署到 Openshift(企业级的 Kubernetes) 集群。部署的第一步就是应用程序的容器化,持续集成的交付物从以往的 jar 包、webpa...

easylife206的专栏 3593

heroku-buildpack-scala:Heroku构建包

用于Scala的Heroku Buildpack 这是Scala应用程序的官方 。 这个怎么运作 如果构建包具有一个project/build.properties文件以及一个基于.sbt或.scala的构建配置(例如,一个build.sbt文件),则buildpack将把您的应用程序检测为Scala。 它在您的插件中提供了sbt版本(如果您不使用sbt-native-packager,它还将在您的插件中包含填充的.ivy/cache )。 .ivy2目录将在构建之间缓存,以缩短构建时间。 强烈建议您在此buildpack中使用sbt-native-packager而不是sbt-start-script。 不建议使用后者,并且会导致塞子尺寸过大。 文献资料 有关在Heroku上使用Scala和buildpacks的更多信息,请参阅以下文章: 例子 有许多示例应用程序演示了配置项目以在H

使用Buildpacks构建Docker镜像

通过这样做,他们提供了一种控制的平衡,最小化了最初的生产时间,减少了开发者的操作负担,并支持大规模管理应用程序的企业运营商。在构建过程中,stacks的构建镜像成为执行Buildpack的环境,其运行镜像成为最终应用程序镜像的基础。构建是对应用程序的源代码执行一个或多个buildpacks构建包以生成可运行的OCI镜像的过程。分析:CNB 会在应用的生命周期中运行多次,在这一步骤里会对前一次的打包内容进行分析,分析过程会对文件的变更进行优化,从而减少构建时间和文件传输。后续的构建将利用各种形式的缓存。

niwoxiangyu的博客 1902

没有秘密的buildpack

没有秘密的Buildpack 这是一个 ,可在构建和映像之前扫描您的源代码中的秘密。 这可以防止将机密泄漏到不应在其中的Docker注册表或运行时环境中。 用法 您可以将此构建包与共享兼容堆栈的任何其他构建包结合使用。 例如: $ pack build -b jkutner/no-secrets,heroku/nodejs myapp 怎么运行的 该buildpack将安装脚本的子集,并在不使用Git的情况下运行它。 但是,它仍然使用Git存储模式(禁止和允许),这意味着在构建映像上需要git 。

Git Worktree + Claude Code:多终端并发开发完全实战

深入讲解如何使用 Git Worktree 配合多终端 Claude Code 实现并发开发,通过实战案例展示如何在 Android 开发中提升 2-3 倍效率,彻底告别等待 AI 的问题。

Cheson的专栏 1205

Build-packs 不使用Dockerfile也能构建镜像

1.准备我们所需要的环境(docker 和pack 第二条命令可直接安装成功) [root@yaqu002 ~]# docker -v Docker version 20.10.14, build a224086 [root@yaqu002 ~]# (curl -sSL "https://github.com/buildpacks/pack/releases/download/v0.24.1/pack-v0.24.1-linux.tgz" | sudo tar -C /usr/local/bin/ --

weixin_47919821的博客 1289

基于FT2232集成USB直接实现XilinxJTAG和UART串口

使用“program_ftdi -write -ftdi FT2232H -serial 0ABC01 -vendor "my vendor co" -board "my board" -desc "my product desc"”命令进行数据烧写,该命令会将FT2232的通道A配置为JTAG,其余通道配置为UART,serial长度为6~12个字符(vivado扫描JTAG时显示的cable序列号,同一台PC能够同时连接多个不同序列号的cable仿真器)。图 2 program_ftdi的帮助信息。

luguodeyo的博客 1万+

CloudFoundry-Offline-BuildPack

一、CloudFoundry-Offline-BuildPack

洋羊阳的专栏 3280

DBeaver连接ClickHouse保姆级教程:从安装到成功测试(附驱动下载问题解决)

本文提供了一份详细的DBeaver连接ClickHouse实战指南,重点解决了驱动下载失败等常见问题。文章从环境准备、DBeaver安装讲起,详细阐述了手动配置ClickHouse驱动的可靠方案,并逐步指导完成连接配置与测试,最后介绍了基础操作与查询优化技巧,旨在帮助用户高效完成连接并快速上手使用。

pink的博客 879

基于双目视觉的行车中障碍距离检测方法研究与目标跟踪

本文将介绍基于Python语言的双目视觉技术,以及如何使用该技术检测行车中的障碍物并跟踪目标。双目视觉利用两个摄像头模拟人眼的立体视觉,通过对两个摄像头所捕捉的图像进行比较和分析,可以得到物体的深度信息。首先,我们需要安装Python的OpenCV库,该库提供了丰富的图像处理和计算机视觉功能。接下来,我们进入一个循环中,不断读取左右图像,并将其转换为灰度图像。在视差图上,您可以实现目标检测和跟踪算法来识别和跟踪行车中的障碍物。请注意,上述代码只是一个简单示例,您可以根据具体需求和算法进行修改和扩展。

ZgnObjectivec的博客 277

CloudFoundry简介

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33825683的博客 1万+

AI智算-K8s+vLLM & Ray:DeepSeek-r1 671B 满血版分布式推理部署实践

自从上次发布 【AI-智算】K8s+SGLang实战:DeepSeek-r1:671b满血版多机多卡私有化部署全攻略] 文章后,本次将演示另一个主流推理引擎工具——vLLM,结合K8s、LWS、Ray、Volcano等技术栈,部署DeepSeek-r1 671b 满血版分布式推理集群,并对比其与SGLang推理引擎的性能表现。

Kason_iWiki 1825

CloudFoundry中buildpack引见与自定义实践

转自:http://www.myexception.cn/cloud/1482097.html,自己看看的。

Cabinathor的专栏 727

华为OD新系统机试真题-勇攀数字高峰(Java/Py/C/C++/Js/Go)

新系统 华为OD机试新系统【勇登数字高峰】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统机试真题【勇登数字高峰】

qq_45776114的博客 1546

【Altium Designer】Off grid pin解决方法

​今天我画完原理图编译时,出现了太多的黄色(出现warning警告提示)Off grid pin警告,这个警告并不是原理图电气连接出问题了,而是元器件或器件PIN脚没有和栅格对齐造成的原因。再编译还是出现这个警告。 最后经过不断翻阅网上经验和实践,才最终解决,本经验详细记录了解决该警告的有效方法。 解决方案:以下是问题解决步骤... ​

夜半少年的博客 7548

DEA 和 buildpack

dea 和 buildpack是整个cloudfoundry 设计最出彩的地方,想想别的PaaS 开发新加一门语言是多么费劲?而cloudfoundry 仅仅需要几天,而且还支持用户自定义语言和应用类型, 这一切都是基于buildpack打包设计的功劳。 术语 在提到buildpack之前 有必要解释一下DEA,dea全称是 droplet execution agency,即执行dr

boluobn的专栏 2048

CARLA仿真:自定义地图与AI车辆行为编程

CARLA仿真:自定义地图与AI车辆行为编程 ,人工智能,计算机视觉,大模型,AI,本文围绕CARLA仿真平台,介绍了其基础功能与安装方法,详解地图系统,包括预设地图的加载切换及自定义地图的创建、导入与优化。还阐述了AI车辆的创建、属性设置、销毁,以及行为控制,如交通规则遵守、路径规划、复杂行为编程和行为树应用。同时涉及传感器与车辆感知、交通场景构建、自定义地图与AI行为结合应用、高级应用,以及常见问题解决方案和学习资源,为CARLA仿真应用提供全面指导。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 11万+

cloudfoundry dea 之 app staging

DEA,即Droplet Execution Agent,管理app实例,将状态信息广播出去。比如我们创建一个app,实例的创建命令最终会下发到DEA,DEA调用warden的接口创建container,如果用户要删除某个app,实例的销毁命令最终也会下发到DEA,DEA调用warden的接口销毁对应的container。

jasson的专栏 765

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

linux pack文件镜像,使用buildpack-deps 构建自己的入容器镜像

buildpack-deps 是docker hub 官方提供的一个构建类似heroku stack 镜像的工具包,如果自己看的话,好多docker 官方的基础镜像都基于此基础镜像进行构建的,buildpack-deps 已经提供了好多内置好多依赖库,可以简化我们的镜像部署,同时官方也提供了debian以及ubuntu 等的镜像,很值得使用参考镜像构建golang 官方FROM buildpack...

weixin_39662462的博客 795

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

CloudFoundry 初识

官网:https://cloudfoundry.cn/ 1. 定义 Cloud Foundry是业界第一个开源PaaS云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。 2.PaaS PaaS,平台即服务。是云计算的一种服务形式。其实并不是一个非常新的概念,像GAE、SAE很早就提供了类似这样的服务...

种花家的奋斗兔的博客 2366

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

java buildpack是什么_javabuildpack改造

Buildpack作为开源软件是PaaS平台cloudfoundry的给应用打包,提供运行时环境的工具,Javabuildpack是提供Java应用运行时和框架的组件,使用ruby脚本语言,不过Java应用不都是依赖tomcat,也有的是用play等容器运行,,即使是tomcat,每个应用也可能做了定制化的改造,比如修改tomcat参数、一个tomcat运行几个war包,都是很常见,事无巨细,所以...

weixin_39924674的博客 400

CloudFoundry相关术语解释

CloudFoundry是VMware旗下子公司Pivotal的一款开源PaaS产品,是一个由多个独立子系统组成的分布式系统,能偶支持多种运行时环境、开发语言、框架及服务,可以构建于IaaS平台之上,也可以直接部署于物理机器上,总共有两个版本分别是V1和V2,V2版本采用的更为成熟的架构思想,引入了如Buildpack、Warden等强大灵活的组件,V2版本相比V1版本改动较大,教程及文档等都不通用,所以在使用当中请注意区别。

VF@优快云 2107

java buildpack是什么_java-buildpack

Cloud Foundry Java BuildpackThe java-buildpack is a Cloud Foundry buildpack for running JVM-based applications. It is designed to run many JVM-based applications (Grails, Groovy, Java Main, Play Fram...

weixin_39907311的博客 436

Cloud Foundry buildpack开发部署实例解析

与service broker相比,buildpack的实务操作就容易多了,单就通用概念来说,其实用不着单写一篇,但是处女座强迫症发作,所以还是写一下,使CF这个框架对外扩展的两个维度(代码使用的服务和代码运行的环境)是完整的。这篇主要会写buildpack的基本实现逻辑,然后举三个需要修改buildpack的需求,进行实际操作描述。

泰克轱辘儿 3678

如何使用Java-buildpack-memory-calculator:5分钟快速入门教程

Java-buildpack-memory-calculator是一款专为Cloud Foundry设计的JVM内存配置工具,能够帮助开发者快速计算出合理的JVM内存参数,确保应用在容器环境中既性能良好又不会超出内存限制。本教程将带你快速掌握这个实用工具的核心用法。 ## 🌟 什么是Java-buildpack-memory-calculator? Java-buildpack-memory

gitblog_00026的博客 791
上一篇: cf push之后到底做了什么? - Cloudfoundry发布app过程
下一篇: CloudFoundry中gorouter深入解读
UlricQin
博客等级 码龄17年 21粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值