Как передать параметры подключения к БД в Keycloak в dokerized среде

#docker #keycloak

#docker #keycloak

Вопрос:

Я работаю с сервером Keycloak, который работает внутри контейнера Docker.

Я разработал поставщика пользовательского хранилища для подключения к клиентской БД в поисках информации о пользователях и проверки входа в систему.

Я написал свойства подключения к БД внутри кода, но теперь пришло время сделать это правильно, например, предоставить эту информацию контейнеру Docker при его запуске и получить эту информацию из кода.

Я предполагаю, что init(Config.Scope config) метод моего UserStorageProviderFactory — это место, где нужно искать эти параметры. Там config параметр содержит информацию из файла standalone.xml , но мне нужно было бы передать параметры подключения в Docker при запуске, чтобы их можно было легко изменить.

Как я могу получить это таким образом?

Ответ №1:

Вы можете использовать скрипт jboss-cli для добавления вашего пользовательского хранилища в standalone/-ha.xml со свойствами, которые могут быть установлены переменными среды, которые вы передаете в контейнер.

Пример:

Допустим, у нас есть скрипт spi.cli со следующим:

 /subsystem=keycloak-server/spi=my-spi/provider=my-custom-auth-provider:add(enabled=true,properties={"my.custom.property", "${env.MY_ENV:myDefaultValue}"})
  

Это можно поместить в /opt/jboss/startup-scripts папку в контейнере для автоматического запуска при запуске, см. Документацию Keycloak docker.

При запуске он сгенерирует следующее в автономном режиме:

 <spi name="my-spi">
    <provider enabled="true" name="my-custom-auth-provider">
        <properties>
            <property name="my.custom.property" value="${env.MY_ENV:myDefaultValue}"/>
        </properties>
    </provider>
</spi>  

Затем к этим свойствам можно получить доступ в коде, используя Config.Scope в методе init.
Например config.get("my.custom-property") .

Затем это восстановит значение, переданное в контейнер, -e MY_ENV=test_value .

Ответ №2:

Контейнер Docker должен запускаться с -e опцией типа:

 -e ENV_VAR_1=env_var_value1
  

Он может содержать столько опций, сколько необходимо. Другой способ — использовать --env-file option для добавления переменных, содержащихся в файле.

Затем в коде поставщика пользовательского хранилища вы можете проверить значение переменной среды, например:

 System.getenv("ENV_VAR_1")
  

Комментарии:

1. Я использую initContainer, который копирует jar-файл spi хранилища в папку поставщиков ключей. Где в initContainer я упоминаю -e? Я считываю переменные env с помощью секретов, которые отображаются на уровне контейнера, но spi хранилища не может их прочитать.

2. Извините, coretechie, я перестал работать с Keycloak много лет назад. Вы можете создать новый вопрос в StackOverflow, уверен, что кто-нибудь вам поможет.

3. Спасибо, @Пако Абато, ценю твой ответ.