02-如何将配置文件变量动态化.md 3.2 KB

1. Git 上需要修改的文件

  1. 在 rancher-compose 中 增加 question 段,每个 question 都包含 variable、type、default 等值。variable 就是用户需要指定的变量
  2. 在 docker-compose 中,引入上一个 question 中的 变量。如果不引入,rancher-compose 中新增的变量就无法传送给容器。
  3. 修改 answer.txt 文件。这个文件提供自动化部署默认值。

rancher-compose 中的 question

docker-compose 中接受变量

2. 修改本地 SVN 的文件

Docker 化的网元中,有个 /docker/conf/ 文件夹,里面所放的任何文件(不管有没有后缀),都可以引入变量,如下图中 ① 所示。 根据这个配置文件类型(并非所有配置文件都使用 # 来注释,例如 Json 就不行),添加可行的注释, 显式的指明 配置文件最终的路径,格式如下图中 ② 所示。

# metadata => location:${APP_HOME}/${APP_NAME}/conf/evlss.conf

需要动态化的配置文件样例

3. 变量的传递流程

3.1. 从应用商店部署

  • 应用部署页面将用户定义的 Question 翻译并展示变量表单,提示用户输入变量,如用户不输入,使用变量中默认值
  • 点击部署后,Rancher 会解析 rancher-compose.yml 文件,解析其中的变量和输入值
  • docker-compose 会将变量注入至 environment 中,启动容器时,变量会出现在 container 的 环境变量中,可在容器中通过 setecho 等命令,直接获取这些变量的值
  • 容器启动后,会进入应用启动入口:/usr/local/bin/start.sh,可参考 dockerfile 中的 CMDENTRYPOINT 字段,参考 图 3.1-1
  • start.sh 中会做如下检查:
    • 检查 /docker/conf/ 中的文件,是否有 metadata 信息(没有路径信息,脚本不知道最终需要将配置文件替换后拷贝向哪里)
    • 检查 /docker/conf/ 中的文件,是否里面所有的变量,都接收到了环境变量中的变量值(空值也是值,没有就不行。。)
    • 将所有的变量,替换成对应的值,如将 {{ .ENV.MAX_CONNECTIONS }} 替换为 8000
    • 检查 Dockerfile 中指定的依赖项,是否已启动完成,没有完成就等待 1200 秒,直到超时退出
    • 以上条件都满足后,开始启动应用了,调用 Service_Start 启动应用

图 3.1-1

图 3.1-2

3.2. 从 Jenkins 上自动化部署

Jenkins 自动化部署,由于没有了应用商店 WEB 部署页面,因此所有变量必须得通过 answer.txt 文件进行传递,Rancher 提供了一个 Rancher API 的命令行工具 rancher-compose ,此工具最终调用官方的 docker-compose 将容器部署至指定的服务器上。

注意: Git 中的文件如果要修改后即时生效,需要手动刷新应用商店来生效。默认 Rancher 会每隔 30 分钟自动刷新一次