# 1. Git 上需要修改的文件 1. 在 rancher-compose 中 增加 question 段,每个 question 都包含 variable、type、default 等值。variable 就是用户需要指定的**变量**。 2. 在 docker-compose 中,`引入`上一个 question 中的 变量。如果不引入,rancher-compose 中新增的变量就无法传送给容器。 3. 修改 answer.txt 文件。这个文件提供自动化部署默认值。 ![rancher-compose 中的 question](images/_ranchercom_1533021120_22815.png) ![docker-compose 中接受变量](images/_dockercomp_1533021156_703.png) # 2. 修改本地 SVN 的文件 Docker 化的网元中,有个 /docker/conf/ 文件夹,里面所放的任何文件(不管有没有后缀),都可以引入变量,如下图中 ① 所示。 根据这个配置文件类型(并非所有配置文件都使用 # 来注释,例如 Json 就不行),添加`可行的注释`, 显式的指明 配置文件最终的路径,格式如下图中 ② 所示。 ```conf # metadata => location:${APP_HOME}/${APP_NAME}/conf/evlss.conf ``` ![需要动态化的配置文件样例](images/_需要动态化的配置文件_1533020452_3853.png) # 3. 变量的传递流程 ## 3.1. 从应用商店部署 ![](images/_1533022508_26958.png) - 应用部署页面将用户定义的 Question `翻译`并展示变量表单,提示用户输入变量,如用户不输入,使用变量中默认值 - 点击部署后,Rancher 会解析 rancher-compose.yml 文件,解析其中的变量和输入值 - docker-compose 会将变量注入至 environment 中,启动容器时,变量会出现在 container 的 `环境变量`中,可在容器中通过 `set` 或 `echo` 等命令,直接获取这些变量的值 - 容器启动后,会进入应用启动入口:/usr/local/bin/start.sh,可参考 dockerfile 中的 `CMD` 或 `ENTRYPOINT` 字段,参考 图 3.1-1 - start.sh 中会做如下检查: - 检查 /docker/conf/ 中的文件,是否有 `metadata` 信息(没有路径信息,脚本不知道最终需要将配置文件替换后拷贝向哪里) - 检查 /docker/conf/ 中的文件,是否里面所有的变量,都接收到了环境变量中的变量值(空值也是值,没有就不行。。) - 将所有的变量,替换成对应的值,如将 {{ .ENV.MAX_CONNECTIONS }} 替换为 8000 - 检查 Dockerfile 中指定的依赖项,是否已启动完成,没有完成就等待 1200 秒,直到超时退出 - 以上条件都满足后,开始启动应用了,调用 Service_Start 启动应用 ![图 3.1-1](images/_图311_1533021622_4181.png) ![图 3.1-2](images/_图312_1533022107_8928.png) ## 3.2. 从 Jenkins 上自动化部署 Jenkins 自动化部署,由于没有了应用商店 WEB 部署页面,因此所有变量必须得通过 `answer.txt` 文件进行传递,Rancher 提供了一个 Rancher API 的命令行工具 [rancher-compose](https://github.com/rancher/rancher-compose) ,此工具最终调用官方的 docker-compose 将容器部署至指定的服务器上。 > 注意: Git 中的文件如果要修改后`即时生效`,需要`手动刷新应用商店`来生效。默认 Rancher 会每隔 30 分钟自动刷新一次