У меня есть Java-приложение Spring Boot, которое использует Keycloak для аутентификации и авторизации. Я создал свою сферу, ее пользователей и роли. Я хочу закрепить приложение с помощью Docker Compose. Итак, я создал образ моего Java-приложения в докере. Но когда я захочу создать экземпляр Keycloak (извлекая образ Keyckloak из dockerhub), я потеряю свои постоянные области, пользователей и роли, которые я создал ранее, поскольку он создает новый Keycloak из извлеченного образа Docker. Как сохранить эти данные каждый раз, когда я запускаю приложение с помощью Docker Compose? На самом деле мне нужно, чтобы данные Keycloak (области, пользователи и роли) инициализировались автоматически всякий раз, когда я запускаю Docker Compose.
Обновлять:
Позвольте мне прояснить проблему.
Я хочу разместить коды на Github, и когда кто-нибудь получит и запустит их (тщательно создаст докер); используя предопределенные пользователи и пароли keycloak, используйте приложение. Проблема в том, что когда кто-то каждый раз запускает код с помощью Docker Compose, нет области, пользователей и ролей, потому что образ Keycloak извлекается и запускается без каких-либо данных (областей, пользователя и т. д.). На самом деле я не хочу, чтобы пользователи, запускающие приложение, определяли данные Keycloak (область, пользователь и т. д.). Я хочу, чтобы эти данные уже существовали в каждом запущенном приложении, чтобы пользователи могли войти в мое приложение и использовать его.
приложение.yml:
spring:
application:
name: my-client
security:
oauth2:
client:
registration:
myclientapp:
client-id: my-client-app
client-secret: secrectKey12345
scope: openid, profile, roles
authorization-grant-type: authorization_code
redirect-uri: http://localhost:8085/login/oauth2/code/myclientapp
provider:
myclientapp:
authorization-uri: http://localhost:8080/realms/myclientapp/protocol/openid-connect/auth
token-uri: http://localhost:8080/realms/myclientapp/protocol/openid-connect/token
jwk-set-uri: http://localhost:8080/realms/myclientapp/protocol/openid-connect/certs
user-info-uri: http://localhost:8080/realms/myclientapp/protocol/openid-connect/userinfo
user-name-attribute: preferred_username
файл pox.xml:
<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.my-client</groupId>
<artifactId>client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>client</name>
<description>Demo project for Spring Client</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
Большое спасибо.
Спасибо за ваш ответ. Мне жаль, что я не посещал stackoverflow последние несколько дней. Я попробую ваше решение.
Экспортируйте свою область Keycloak и пользователей и добавьте их в папку контейнера /opt/keycloak/data/import/
.
После того, как ваши клиенты и пользователи области настроены с помощью пользовательского интерфейса администратора Keycloak, на рабочем столе Docker:
Exec
, чтобы запустить:cd /opt/keycloak/bin/
sh ./kc.sh export --dir /tmp/keycloak/ --users realm_file
Files
и возьмите файл экспорта для области, которую вы хотите восстановить в /tmp/keycloak/
(здесь и далее я сохраняю его в каталоге ./keycloak/import/
относительно файла компоновки Docker, но мог бы выбрать ./keycloak/data/import/
, чтобы сохранить ту же структуру каталогов, что и при установке Keycloak в контейнере)volume
для монтирования в /opt/keycloak/data/import/
каталог, в котором вы сохранили файл, экспортированный из Keycloak. В моем случае: volumes:
- ./keycloak/import/:/opt/keycloak/data/import/
Примеры полных проектов, делающих это:
Спасибо за ваш ответ. Мне жаль, что я не посещал stackoverflow последние несколько дней. Я попробую ваше решение.
Это сработало. Спасибо за помощь.
Я думаю, если мы настроим нашу базу данных, они должны сохраниться.
Если эта база данных не находится в одноразовом контейнере Docker, да, конфигурация сохраняется. Но в любом случае это не соответствует требованию в теле вопроса: устанавливать начальную конфигурацию, когда разработчик запускает файл компоновки на новом компьютере.
Есть ли причина, по которой мой пост не ответил на ваш вопрос?