我想基于从env变量收集的值(ex.redis_host
)生成动态配置文件(redis,数据库),这些变量因服务而异,并将其放在特定位置(config/redis.yml
)。
我将如何实现它?
答案 0 :(得分:2)
动态配置文件生成可以包括
的创建配置文件结构:
例如redis.yaml的配置文件可能适用于开发,登台,生产环境。 例如:
分期
${ENVIRONMENT}:
host: ${REDIS_HOST}
namespace: ${REDIS_NAMESPACE}
port: 6379
生产:
${ENVIRONMENT}:
host: ${REDIS_HOST}
namespace: ${REDIS_NAMESPACE}
port: 6379
connect_timeout: ${REDIS_CONNECT_TIMEOUT}
timeout: {REDIS_TIMEOUT}
配置文件内容:
配置文件的内容可以再次动态填充。
我们可以使用helm生成config-templates
或config-file-structure
并将它们安装在pod中所需的位置(比如config / redis.yaml)。然后可以将这些配置模板转换/渲染为适当的在容器运行时使用实用程序的文件。
可以使用以下方法实现基于environment / environment_variables动态创建配置文件。
Bash Way (使用eval
和cat
):
使用以下内容创建名为inator
的文件
#!/bin/bash
eval "cat <<EOF
$(<$1)
EOF
" | tee $1 >/dev/null
将inator设为可执行文件并将其放在docker镜像中并作为ENTRYPOINT脚本执行
考虑到env varibles可以在pod /容器中使用
例如: 分期
$ env
ENVIRONMENT=staging
REDIS_HOST=abc.com
REDIS_NAMESPACE=inator
$ cat config/redis.yaml
${ENVIRONMENT}:
host: ${REDIS_HOST}
namespace: ${REDIS_NAMESPACE}
port: 6379
$ ./inator config/redis.yaml
$ cat config/redis.yaml
staging:
host: abc.com
namespace: inator
port: 6379
生产
$ env
ENVIRONMENT=production
REDIS_HOST=redis.prod.com
REDIS_NAMESPACE=prod
REDIS_CONNECT_TIMEOUT=5
TIMEOUT=10
$ cat config/redis.yaml
${ENVIRONMENT}:
host: ${REDIS_HOST}
namespace: ${REDIS_NAMESPACE}
port: 6379
connect_timeout: ${REDIS_CONNECT_TIMEOUT}
timeout: {REDIS_TIMEOUT}
$ ./inator config/redis.yaml
$ cat config/redis.yaml
production:
host: redis.prod.com
namespace: prod
port: 6379
connect_timeout: 5
timeout: 10
优点: 无需额外包装。
dockerize方式:
dockerize是一个简化在docker容器中运行应用程序的实用程序。它在内部使用go模板从环境变量标签中填充配置文件。
有关详细信息,请查看此博文Environment Variable Templates。
答案 1 :(得分:1)
也许helm可以帮到你。 Helm允许您模拟k8s yaml文件并将它们捆绑到一个可部署的k8s包中。 您的配置文件可能放在ConfigMaps中,也可以使用helm进行模板化。如何详细完成这一点可以在chart template guide。
中看到在部署时填充这些模板的一种方法是:
helm upgrade --install my-service /path/to/my/chart/package --set my.value=${MY_VALUE_ENV_VAR}