Использование переменных среды для настройки Docker развертывания приложения Lagom Scala - PullRequest
0 голосов
/ 23 января 2020

Мы разрабатываем несколько микро-сервисов Scala на базе Lagom. Они настраиваются с помощью замены переменных в application.conf, например.

mysql = {
  url = "jdbc:mysql://"${?ENV_MYSQL_DATABASE_URL}

Во время разработки мы устанавливаем эти переменные как Java Свойства системы через файл env.sbt, который вызывает System.setProperty("ENV_MYSQL_DATABASE_URL", url). Это работает нормально.

Теперь я хочу развернуть это в контейнере для моей локальной установки Docker. Мы используем SbtReactiveAppPlugin для создания Docker образа из build.sbt и просто запускаем sbt Docker/publishLocal. Это работает, как и ожидалось, образ Docker создан, и я могу его запустить.

Однако передача переменных среды с использованием стандартных механизмов компоновки docker или docker, похоже, не работает. Хотя я вижу, что переменные среды установлены правильно внутри контейнера Docker (проверено с помощью env на bash, а также с помощью log.debug("ENV_MYSQL_DATABASE_URL via env: " + sys.env("ENV_MYSQL_DATABASE_URL")) внутри службы), они не используются application.conf и недоступно в конфигурации системы. Значения являются пустыми / неустановленными (проверено с помощью configuration.getString("ENV_MYSQL_DATABASE_URL").toString() и исключений, выданных системой mysql и другими системами).

Единственный способ, с помощью которого я получил его, состоял в том, чтобы выдумать это в JAVA_OPTS через JAVA_OPTS=-D ENV_MYSQL_DATABASE_URL=..... Тем не менее, это выглядит как хак и не очень хорошо масштабируется с десятками параметров среды.

Я что-то упустил, есть ли способ легко использовать переменные среды внутри приложения и приложения Lagom .conf?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Хотя я согласен с ответом Леви Рамси, я бы посоветовал вам использовать typesafe config для загрузки вашей конфигурации

0 голосов
/ 23 января 2020

Я использовал конфигурацию Lightbend для настройки служб Lagom с помощью переменных среды в docker контейнерах в течение многих лет, поэтому знайте, что это можно сделать, и это было довольно просто в моем опыте.

С этим в помните, когда вы говорите, что они не используются application.conf, вы имеете в виду, что они не установлены? Обратите внимание, что если вы не передадите очень специфическую опцию c в качестве свойства Java, configuration.getString("ENV_MYSQL_DATABASE_URL") не будет читать из переменной среды, поэтому проверка, которая не сообщит вам ничего о том, влияет ли среда на mysql.url переменная. configuration.getString("mysql.url") даст вам лучшее представление о том, что происходит.

Я подозреваю, что на самом деле ваше Docker изображение создается с жестко заданными свойствами dev-mode, а поскольку системные свойства Java принимают Приоритет над всем остальным, они скрывают переменную окружения.

Вы можете найти полезным структурировать application.conf по следующим направлениям:

mysql_database_url = "..."   # Some reasonable default default for dev-mode
mysql_database_url = ${?ENV_MYSQL_DATABASE_URL}

mysql {
  url = "jdbc://"${mysql_database_url}
}

В этом случае у вас есть разумное значение по умолчанию для разработчика (возможно, включение в документацию некоторых инструкций по запуску MySQL способом, совместимым с этой конфигурацией). Затем значение по умолчанию можно переопределить, установив свойство Java (например, JAVA_OPTS=-Dmysql_database_url) или установив переменную окружения ENV_MYSQL_DATABASE_URL.

...