lain.yaml 提供了一些选项来优化构建过程。
laincloud/hello-world/lain.yaml@service
中需要下载 github.com/go-redis/redis
,如果网络较慢的话会拖慢 lain build
时间,这时我们可以添加
build.prepare
,来缓存下载结果。
build:
base: golang:1.8
prepare: # lain prepare 时以 build.base 为基底镜像,执行 build.prepare.script,生成 registry.${LAIN-domain}/hello-world:prepare-${build.prepare.version}-${timestamp},作为 lain build 的新基底镜像
version: 201705231514 # lain build 时会选取 version 最大的 prepare 镜像作为基底镜像
script:
- go get -u github.com/go-redis/redis # 安装依赖
script: # 以 registry.${LAIN-domain}/hello-world:prepare-201705231514-${timestamp} 为基底镜像
- go build -o hello-world # 编译,类似于 Dockerfile 里的 RUN,WORKDIR 为 /lain/app
Docker 的镜像文件是分层存储的。如果在生产环境的话,我们可能会希望使用统一的 release 基底镜像, 来减小 registry.${LAIN-domain} 存储的镜像体积:
release: # 运行容器时使用的镜像,不写时默认为 hello-world:build-${git-committer-date}-${git-commit-hash}
dest_base: centos:7 # 团队内部可能会希望采用统一的基底镜像,以减小镜像仓库存储的镜像体积
copy: # 将 build 镜像里的编译结果复制到 release 镜像
- src: /lain/app/hello-world # build 镜像里的编译结果
dest: /hello-world # release 镜像里的路径
laincloud/hello-world@master 的完整代码在这里。
试着多次运行 lain build
,速度是不是加快了?
一般,我们会部署测试和生产 2 个 LAIN 集群,在这种情况下,我们可以根据 LAIN_DOMAIN
这个环境变量得知运行时应用所处的环境。因为涉及到条件分支,建议编写一个单独的 entry.sh
文件,然后将 proc.${proc-name}.cmd
设置为 entry.sh
。
entry.sh
的最后一条命令应使用 exec 启动,以避免 fork 一个新的进程。