Как передать пароль источника данных в контейнер websphere liberty во время выполнения - PullRequest
3 голосов
/ 03 июля 2019

Я пытаюсь запустить свое приложение в контейнере профиля websphere liberty. Я хочу иметь 1 изображение, которое можно запустить в diff env (dev, st, sit и т. Д.). Я могу использовать переменную env для передачи значений во время выполнения в контейнер. Как их использовать в настройках wlp? Возможно ли это?

В файле server.xml я определил источник данных со всеми свойствами конфигурации, такими как строка подключения, имя пользователя и пароль. Я построил изображение, используя этот файл. Теперь я хочу протестировать одно и то же изображение в разных env, передавая значения как переменную env вместо жесткого кодирования в server.xml. Я не смог найти способ, где server.xml может читать env var напрямую и заменять переменную пароля. Другой способ, которым я пытался, - это использовать bootstrap.properties, и поэтому server.xml может читать значения из этого файла. Но и здесь я должен предоставить bootstrap.properties во время создания образа и не могу изменить значения во время выполнения.

строк в server.xml:

<dataSource name="XYZ" jndiName="jdbc/xyz" transactional="false"> <jdbcDriver id="OracleJdbcDriver" libraryRef="xyzLib"/> <properties.oracle URL="${db.url}" user="${db.username}" password="${db.password}"/> </dataSource>

db.url, db.username и db.password определены в bootstrap.properties, который упакован в образ во время сборки.

Ответы [ 2 ]

2 голосов
/ 04 июля 2019

Хотя ответ @atline является правильным для более старых выпусков Liberty, так как вопрос выполняется в контейнерах Docker, они, скорее всего, работают на версии Liberty с 19.0.0.3, которая имеет другое поведение в отношении разрешения переменных.

Начиная с 19.0.0.3 разрешение переменной среды не требовало env.префикс и не требует, чтобы имя переменной было в верхнем регистре.Как описано в этой ссылке

переменные окружения могут быть доступны как переменные.Начиная с 19.0.0.3 к ним можно получить прямой доступ, ссылаясь на имя переменной среды.Если переменная не может быть разрешена, пробуются следующие преобразования в имени переменной среды:

  • Заменить все не-буквенные символы на _
  • Измените все символы на верхний регистр.

Если вы введете $ {my.env.var} в server.xml, он будет искать переменные среды со следующими именами:

  • my.env.var
  • my_env_var
  • MY_ENV_VAR

При использовании выпуска Liberty старше 19.0.0.3 к переменным среды можно получить доступ, добавив env.к началу имени переменной среды:

<httpEndpoint id="defaultHttpEndpoint"
             host="${env.HOST}"
             httpPort="9080" />

Исходя из вопроса, кажется, что значение указывается в bootstrap.properties, а также в переменных окружения, а bootstrap.properties переопределяет переменные окружения:

Вы можете параметризовать конфигурацию сервера, используя переменные.При разрешении имен переменных используются следующие источники в порядке возрастания приоритетов:

  • значения переменных по умолчанию server.xml
  • переменные среды
  • bootstrap.properties
  • Свойства системы Java
  • server.xml config

Чтобы получить их для чтения из докера, необходимо удалить их из bootstrap.properties.Для вашего примера:

<dataSource name="XYZ" jndiName="jdbc/xyz" transactional="false">
    <jdbcDriver id="OracleJdbcDriver" libraryRef="xyzLib"/>
    <properties.oracle URL="${db.url}" user="${db.username}" password="${db.password}"/>
</dataSource>

если вы удалите определение db.url, db.password и db.username из bootstrap.properties, тогда вы можете запустить образ докера следующим образом:

docker run -d -e db_url=xxx -e db_username=xx -e db_password=x your_image

Если вы хотите, чтобы значения по умолчанию были определены, если они не указаны, вы можете добавить это к вашему server.xml:

<variable name="db.url" defaultValue="jdbc:XXX"/>
<variable name="db.username" defaultValue="testUser"/>
<variable name="db.password" defaultValue="testPassword that will be encoded or encrypted"/>

Если вы хотите закодировать или зашифровать пароль, чтобы он не был вВы можете использовать обычный текст:

securityUtility encode --encoding=[xor|aes]

полная справка для всех опций доступна при запуске:

securityUtility help encode
2 голосов
/ 03 июля 2019

С это :

Могут быть ссылки на следующие предопределенные переменные:
* свойства каталога, см. Liberty: расположение и свойства каталога
* Свойства системы JVM
* переменные среды процесса

Если одна и та же переменная указана в нескольких местах, приоритет будет следующим:
* переменные в bootstrap.properties переопределяют переменные среды процесса
* переменные в server.xml или включенные файлы XML, переопределяют переменные в bootstrap.properties и переменные среды процесса

Использовать переменные среды процесса в конфигурации. Переменные среды процесса доступны, если вы используете env. префикс переменной конфигурации, например:

<fileset dir="${env.LIBRARY_DIR}" includes="*.jar"/>

Для получения дополнительной информации об указании переменных среды см. Настройка среды Liberty.

Тогда вероятное решение:

server.xml:

<properties.oracle URL="${env.db_url}" user="${env.db_username}" password="${env.db_password}"/>

Передача среды в контейнер только при запуске:

docker run -d -e db_url=xxx -e db_username=xx -e db_password=x your_image

Затем различные значения будут передаваться в разные контейнеры и, наконец, на них ссылается server.xml в формате env..

UPDATE:

Из @Lata попробуйте следующее:

Я пробовал сценарий с заглавными и строчными буквами. То, что я получил, не имеет значения, какой корпус вы используете в server.xml. Но при вызове Docker Run вы должны передавать переменные в CAPS только для работы.

  • server.xml - CAPS Letter
    • Docker run - буква CAPS - работает
    • docker run - строчная буква - не работает.
  • server.xml - строчная буква
    • docker run - CAPS letter - работает.
    • Docker run - строчная буква - не работает.

Итак, окончательный вывод должен быть следующим: неважно, прописные или строчные буквы в server.xml, но нужно передать env CAPS в docker run. Так как в Docker нет таких ограничений, определенно websphere применяют этот предел.

...