Переопределение конфигурации соединителя сервера с переменными env с помощью dropwizard

Я разместил этот вопрос в списке рассылки dw, но не получил ответа.

Можно ли предположить, что формат YML ниже не работает для DW 0.7.0? (Использование @ char для вставки env var)

server:
  applicationConnectors:
    - type: http
      bindHost: @[email protected]
      port: @[email protected]

Ошибка:

Неправильный YAML в строке: 28, столбец: 17; при сканировании следующего токена; найденный символ @'@', который не может запустить какой-либо токен. (Не используйте @для отступов); в "читателе", строка 28, столбец 17:           bindHost: @OPENSHIFT_DIY_IP @

Поэтому я решил использовать этот формат:

server:
  type: simple
  applicationContextPath: /
  adminContextPath: /admin
  connector:
      type: http
      bindHost: localhost
      port: 8080

И попытался переопределить его с помощью jvm-опций:

java -Ddw.server.connector.bindHost=$OPENSHIFT_DIY_IP -Ddw.server.connector.port=$OPENSHIFT_DIY_PORT -jar target/myapp.jar server myapp.yml

Мои локальные переменные env:

OPENSHIFT_DIY_IP=localhost
OPENSHIFT_DIY_PORT=8080

Ошибка, полученная из этой настройки:

Исключение в потоке "main" java.lang.RuntimeException: java.net.SocketException: неразрешенный адрес     на org.eclipse.jetty.setuid.SetUIDListener.lifeCycleStarting(SetUIDListener.java:213)     ... Вызвано: java.net.SocketException: неразрешенный адрес     at sun.nio.ch.Net.translateToSocketException(Net.java:157)     ... WARN [2014-05-03 20: 11:19,412] org.eclipse.jetty.util.component.AbstractLifeCycle: FAILED [email protected]: java.lang.RuntimeException: java.net.SocketException: Неразрешенный адрес

Что я делаю неправильно?

Ответ 1

кто-то создал пакет для DW, чтобы иметь возможность вставлять env vars

Ответ 2

Начиная с версии Dropwizard 0.8.0, вы можете получить доступ к переменным среды из файла конфигурации yml. Он также поддерживает установку значения по умолчанию, если переменная среды недоступна. Смотрите документы здесь.

Пример

// put environment variable inside ${}
// use :- operator to provide default value

dbHost: ${DB_HOST}
dbPort: ${DB_PORT:-1234}
// dbPort = 1234, if DB_PORT environment variable has no value

Важное примечание. Для этого вам нужно настроить SubstitutingSourceProvider с помощью EnvironmentVariableSubstitutor.

// Enable variable substitution with environment variables
bootstrap.setConfigurationSourceProvider(
    new SubstitutingSourceProvider(
        bootstrap.getConfigurationSourceProvider(),
        new EnvironmentVariableSubstitutor())
);

Обновление: 15/ноябрь/2017 Как упоминалось в разделе комментариев в разделе @EFreak, new EnvironmentVariableSubstitutor() будет бросать UndefinedEnvironmentVariableException, если переменная окружения не определена, если вы не установите для режима strict значение false с помощью new EnvironmentVariableSubstitutor(false) https://github.com/dropwizard/dropwizard/blob/master/dropwizard-configuration/src/main/java/io/dropwizard/configuration/EnvironmentVariableSubstitutor.java