在Typesafe Config中使用环境变量覆盖配置

20

使用 typesafe config,我该如何用环境变量覆盖参考配置?例如,假设我有以下配置:

foo: "bar"

如果存在环境变量FOO,我希望它能被覆盖。


你可以尝试其他方法,比如:https://dev59.com/A18f5IYBdhLWcg3wK__4#24967100。我建议使用“-D”JVM参数来覆盖它们 - 你不需要提前知道或实现任何东西。 - yǝsʞǝla
谢谢,但我对这些建议的问题在于我需要将给定的环境变量转换为另一个文件(并即时转换键),以便使用引用答案,或者特别提到每个参数作为系统属性 - 这就是我目前所做的 - 但很难管理并且会导致大量重复维护。 - David Rabinowitz
你只需要提到在配置文件或CMD参数中覆盖的参数,无需列出所有值。 - yǝsʞǝla
没错,但我有一个应用程序,将其打包成 Docker 镜像,然后运维团队可以覆盖许多配置参数。我们已经尝试过了,但很难管理。 - David Rabinowitz
3个回答

17
如果我正确理解了你的问题,答案在这里: 这里。 你可以这样做。
foo: "bar"
foo: ${?FOO}

3
我猜我错过了那部分内容,但它让配置文件变得非常繁琐 - 我需要复制所有想要覆盖的字段,并且我需要知道我想要覆盖哪个变量。 - David Rabinowitz
@DavidRabinowitz 就记录而言,我目前已经使用 Golang 配置,按照你在这里期望的方式工作(从具有相同名称的 env 自动替换)。 我的立场是,“繁琐”的 hocon 解决方案为您提供了更大的灵活性,并避免了您需要定制时跳过各种障碍。当 env-vars 提供值时,命名可能不是您可以自由选择的(即 DevOps),这一点非常重要。 - pagoda_5b

15

官方文档现在已经非常清楚地描述了它,并支持多种选项。这里是一个简要总结...

常见的方法是使用这种形式:

basedir = "/whatever/whatever"
basedir = ${?FORCED_BASEDIR}
如果环境变量被设置,它将覆盖默认值,否则将保持不变。
一种更方便的方法是使用JVM属性-Dconfig.override_with_env_vars=true来覆盖任何配置变量。在这种情况下,您无需创建重复声明。您的环境变量必须以前缀CONFIG_FORCE_命名。请查看文档中环境变量到配置名称映射的工作原理。例如:CONFIG_FORCE_a_b__c___d将被映射为a.b-c_d
最后,如果您想要自己掌握映射方式,而不使用override_with_env_vars选项,则可以使用以下描述的某些shell技巧。
如果您必须使用环境变量,并且它们的命名与配置名称一致,您可以使用像这样的Bash脚本自动从环境变量转换为JVM命令行参数。这些-D JVM参数将覆盖Typesafe Config值。示例:
# export my_PROP1=1
# export my_PROP2=2
#
# props=$(env | grep my_ | awk '{print "-D"$_}' ORS=' ')
#
# echo "JVM executable command is: java $props some.jar"
JVM executable command is: java -Dmy_PROP2=2 -Dmy_PROP1=1  some.jar

将大写字母转换为小写字母,如果环境变量不能直接映射到配置值,请随意对其进行子字符串操作。


2

我正在使用系统属性-Dconfig.override_with_env_vars=true。使用该属性,所有属性都会自动通过环境变量进行覆盖。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接