Ну, как следует из названия, это скорее проблема записи. Я пытался следовать инструкциям в этом README файле образов докер-сервера Keycloak, но столкнулся с несколькими блокировщиками.
После извлечения изображения приведенная ниже команда запустить автономный экземпляр не удалась.
docker run jboss/keycloak
Трассировка стека ошибок:
-b 0.0.0.0
=========================================================================
Using PostgreSQL database
=========================================================================
...
04:45:06,084 INFO [io.smallrye.metrics] (MSC service thread 1-5) Converted [2] config entries and added [4] replacements
04:45:06,096 ERROR [org.jboss.as.controller.management-operation] (ServerService Thread Pool -- 33) WFLYCTL0013: Operation ("add") failed - address: ([
("subsystem" => "datasources"),
("data-source" => "KeycloakDS")
]) - failure description: "WFLYCTL0113: '' is an invalid value for parameter user-name. Values must have a minimum length of 1 characters"
...
Caused by: java.lang.RuntimeException: Failed to connect to database
at org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.getConnection(DefaultJpaConnectionProviderFactory.java:382)
...
Caused by: javax.naming.NameNotFoundException: datasources/KeycloakDS -- service jboss.naming.context.java.jboss.datasources.KeycloakDS
at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:106)
...
Мне было интересно, как он использует базу данных PostgreSQL, и предполагал, что он может раскрутить свой собственный экземпляр. Но, похоже, ошибка связана с подключением к базе данных.
Переход на встроенную базу данных H2 заставил ее работать.
docker run -e DB_VENDOR="h2" --name docker-keycloak-h2 jboss/keycloak
Файл docker-entrypoint.sh показывает, что он использует приведенную ниже логику для определения используемой БД.
if (getent hosts postgres &>/dev/null); then
export DB_VENDOR="postgres"
...
И далее по ходу этого файла change-database.cli указывает, что он действительно ожидает использования запущенного экземпляра PostgreSQL.
connection-url=jdbc:postgresql://${env.DB_ADDR:postgres}:${env.DB_PORT:5432}/${env.DB_DATABASE:keycloak}${env.JDBC_PARAMS:}
Так что я начал задаваться вопросом, как PostgreSQL был выбран по умолчанию изначально. Выполнение приведенных ниже команд в работающем Docker-контейнере Keycloak выявило некоторые интересные вещи.
[root@71961b81189c bin]# getent hosts postgres
69.172.201.153 postgres.mbox.com
[root@71961b81189c bin]# echo $?
0
Не уверен, что это postgres.mbox.com
, но, видимо, это не ожидаемый сервер PostgreSQL, который должен быть разрешен getent
. Не уверен, что это недавняя проблема Linux. Запись hosts
в файле конфигурации переключателя службы имен /etc/nsswitch.conf
внутри контейнера выглядит следующим образом.
hosts: files dns myhostname
Это источник данных dns
, который разрешил postgres
в postgres.mbox.com
.
Вот почему логика определения поставщика БД завершилась неудачно, что в итоге привело к невозможности запуска контейнера. Инструкции к этому файлу README не работают со дня публикации этого сообщения.
Ниже приведены рабочие команды для правильного запуска сервера Keycloak в Docker с PostgreSQL в качестве базы данных.
docker network create keycloak-network
docker run -d --name postgres --net keycloak-network -e POSTGRES_DB=keycloak -e POSTGRES_USER=keycloak -e POSTGRES_PASSWORD=password postgres
docker run --name docker-keycloak-postgres --net keycloak-network -e DB_USER=keycloak -e DB_PASSWORD=password jboss/keycloak