#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. Спасибо, @Пако Абато, ценю твой ответ.