heroku有一个buildpack的概念,可以使用它的buildpack来搭建任何用户需要的环境。(其实buildpack是CloudFoundry的)
buildpack是用来解决运行一个程序运行时的安装依赖问题,他的规则是这样的。
会有三个目录BUILD, CACHE,ENV
,BUILD
是要搭建环境的目标目录,CACHE
是为了节约时间可以重复利用的缓存目录,ENV
是运行是需要用到的环境变量目录
会有一个tar包,里面的目录结构是:
bin/
|-- detect
|-- compile
|-- release
detect 是一个检测运行环境的脚本,仅仅是检测代码是否符合当前buildpack,只要退出码为0就可以 如下是检测node.js的detect
#!/usr/bin/env bash
# bin/detect <build-dir>
if [ -f $1/package.json ]; then
echo "Node.js" && exit 0
else
echo "no" && exit 1
fi
- compile 是buildpack里面最重要的部分,用来搭建依赖环境
在compile中安装程序需要的依赖,以及编译程序。程序中设定的环境变量放在$ENV下面 结果就放在$BUILD目录下面,所以假如宿主机的环境不变, 把$BUILD,$ENV打个包随便丢哪一台机器都可以被完美复制(看起来还是docker本身的镜像处理地更优雅)
作用是指明程序的addon,和默认入口
#!/bin/sh
cat << EOF
---
addons:
- heroku-postgresql:dev # 说明需要heroku的postgresql插件
default_process_types:
web: bin/node server.js # 默认从一个叫web的入口运行程序,就是运行`bin/node server.js`作为启动
EOF
PS. addon是heroku提供给app的服务,像数据库,短信,发送email之类的东西。
buildpack提供了一个很好的打包应用程序的办法,在docker出现之前。
另外一个好处是只要写好一次buildpack之后,后面就只需要关心自己的具体代码怎么写,而不用去关心程序的依赖