使用typesafe配置中的环境变量覆盖配置

Dav*_*itz 11 config environment-variables typesafe

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

foo: "bar"
Run Code Online (Sandbox Code Playgroud)

我希望它与环境变量一起覆盖(FOO如果存在).

小智 13

如果我正确理解你的问题,答案就在这里.你可以做

foo: "bar"
foo: ${?FOO}
Run Code Online (Sandbox Code Playgroud)

  • 我猜我错过了那个部分,但它使配置文件非常麻烦 - 我需要复制我要覆盖的所有字段,我需要知道我想要覆盖某个变量. (3认同)

yǝs*_*ǝla 12

官方文档现在对它的描述非常清楚,并为此支持多种选择。这是一个简短的总结......

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

basedir = "/whatever/whatever"
basedir = ${?FORCED_BASEDIR}
Run Code Online (Sandbox Code Playgroud)

如果设置了 env 变量,那么它将覆盖您的默认值,否则它将保持不变。

方便的方法是使用 JVM 属性-Dconfig.override_with_env_vars=true来覆盖任何配置变量。在这种情况下,您不必创建重复的声明。您的 env 变量必须以 prefix 命名CONFIG_FORCE_。在文档中查看 env var 到配置名称映射的工作原理。例如:CONFIG_FORCE_a_b__c___d将映射到a.b-c_d.

最后,如果你想推出你自己的 mapping,这类似于上面描述的选项而不使用override_with_env_vars你可以使用一些shell hacking,如下所述。

如果您必须使用环境变量并且它们的命名与配置名称一致,您可以使用像这样的 bash 脚本来自动从您的环境变量转换为 JVM cmd args。这些-DJVM 参数将覆盖类型安全配置值。例子:

# 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
Run Code Online (Sandbox Code Playgroud)

将大写转换为小写,如果它们不直接映射到您的配置值,请随意对环境变量执行子字符串操作。