Skip to content

Instantly share code, notes, and snippets.

@lintianzhi
Created December 5, 2014 17:04
Show Gist options
  • Save lintianzhi/258223c378147d870149 to your computer and use it in GitHub Desktop.
Save lintianzhi/258223c378147d870149 to your computer and use it in GitHub Desktop.
buildpack description

heruku buildpack

heroku有一个buildpack的概念,可以使用它的buildpack来搭建任何用户需要的环境。(其实buildpack是CloudFoundry的)

buildpack是用来解决运行一个程序运行时的安装依赖问题,他的规则是这样的。

会有三个目录BUILD, CACHE,ENVBUILD是要搭建环境的目标目录,CACHE是为了节约时间可以重复利用的缓存目录,ENV是运行是需要用到的环境变量目录

会有一个tar包,里面的目录结构是:

bin/  
|-- detect 
|-- compile
|-- release

首先运行 bin/detect BUILD

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

然后是 bin/compile BUILD CACHE ENV

  1. compile 是buildpack里面最重要的部分,用来搭建依赖环境

在compile中安装程序需要的依赖,以及编译程序。程序中设定的环境变量放在$ENV下面 结果就放在$BUILD目录下面,所以假如宿主机的环境不变, 把$BUILD,$ENV打个包随便丢哪一台机器都可以被完美复制(看起来还是docker本身的镜像处理地更优雅)

最后是 bin/release

作用是指明程序的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之类的东西。

OVER

buildpack提供了一个很好的打包应用程序的办法,在docker出现之前。
另外一个好处是只要写好一次buildpack之后,后面就只需要关心自己的具体代码怎么写,而不用去关心程序的依赖

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment