Переопределение конфигурации с помощью переменных среды в конфигурации typesafe

Используя конфигурацию typesafe, как мне переопределить эталонную конфигурацию с помощью переменной среды? Например, допустим, у меня есть следующая конфигурация:

foo: "bar"

Я хочу, чтобы он был переопределен переменной среды FOO, если она существует.


person David Rabinowitz    schedule 05.07.2016    source источник
comment
Вы можете попробовать другие подходы, такие как: 24967100#24967100" title="переопределение нескольких значений конфигурации в конфигурации typesafe при использовании uberjar для де">stackoverflow.com/questions/24966621/. Я бы предложил переопределить их с помощью -D аргументов JVM - вам не нужно знать заранее/что-либо реализовывать.   -  person yǝsʞǝla    schedule 07.07.2016
comment
Спасибо, но моя проблема с этими предложениями заключается в том, что мне нужно либо преобразовать данные переменные среды в другой файл (и преобразовать ключи на лету), чтобы использовать указанный ответ, либо специально указать каждый параметр как системное свойство - это то, что я делаю в данный момент, но с этим трудно справиться, и это вызывает много двойного обслуживания   -  person David Rabinowitz    schedule 07.07.2016
comment
Вам нужно указать только параметры, которые вы переопределяете либо в файле конфигурации, либо в качестве аргументов CMD. Нет необходимости перечислять все значения   -  person yǝsʞǝla    schedule 07.07.2016
comment
Верно, но у меня есть приложение, которое я упаковываю в образ докера, и тогда команда ops может переопределить многие параметры конфигурации. Мы пробовали, и с этим трудно справиться.   -  person David Rabinowitz    schedule 07.07.2016


Ответы (3)


Если я правильно понял ваш вопрос, ответ здесь . Ты можешь сделать

foo: "bar"
foo: ${?FOO}
person Marco C    schedule 05.07.2016
comment
Я догадался, что пропустил эту часть, однако это делает файл конфигурации очень громоздким - мне нужно дублировать все поля, которые я хочу переопределить, и мне нужно знать, что я хочу переопределить определенную переменную. - person David Rabinowitz; 05.07.2016
comment
@DavidRabinowitz Для протокола: в настоящее время мне приходилось работать с конфигурациями Golang, работающими так, как вы ожидали (автоматическая замена из env с тем же именем). Моя позиция заключается в том, что громоздкое решение hocon дает вам гораздо большую гибкость и избавляет вас от необходимости настраивать по мере необходимости. Что весьма актуально, когда env-vars предоставляет значения, а именование может быть несвободным для вас (например, DevOps). - person pagoda_5b; 14.07.2021

Официальный документ теперь очень четко описывает это и поддерживает несколько варианты для этого. Вот краткое содержание...

Самый распространенный способ – использовать эту форму:

basedir = "/whatever/whatever"
basedir = ${?FORCED_BASEDIR}

Если установлена ​​переменная env, она переопределит ваше значение по умолчанию, в противном случае она останется нетронутой.

Более удобным способом является использование свойства JVM -Dconfig.override_with_env_vars=true для переопределения любой переменной конфигурации. В этом случае вам не нужно создавать дубликаты объявлений. Ваши переменные env должны быть названы с префиксом CONFIG_FORCE_. Посмотрите, как работает преобразование имен env var в config в документации. Например: CONFIG_FORCE_a_b__c___d будет сопоставлено с a.b-c_d.

Наконец, если вы хотите развернуть свое собственное сопоставление, аналогичное варианту, описанному выше, без использования override_with_env_vars, вы можете воспользоваться некоторым взломом оболочки, как описано ниже.

Если вам нужно использовать переменные среды и если их имена соответствуют именам конфигураций, вы можете использовать скрипт bash, подобный этому, для автоматического преобразования переменных вашей среды в аргументы cmd 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

Преобразуйте верхний регистр в нижний, выполняйте операции с подстроками в env vars по своему усмотрению, если они не сопоставляются напрямую с вашими значениями конфигурации.

person yǝsʞǝla    schedule 07.07.2016

Я использую системное свойство -Dconfig.override_with_env_vars=true. При этом все свойства автоматически переопределяются через переменные среды.

person Bernhard    schedule 07.10.2019