我正在尝试自定义我的 Keycloak docker 容器。 我使用
jboss/keycloak:12.0.4
作为我的 docker 镜像的基础镜像。
容器启动中包含的 Liquibase 脚本进行任何所需的更新后,我需要在一个特定表上运行 SQL 更新语句。
脚本位于图像中的什么位置?我好像找不到他们。
注意:我也很高兴收到替代方法。只要在keycloak服务器启动之前更新DB记录即可
我想添加的脚本看起来像这样:
{
"databaseChangeLog": [
{
"changeSet": {
"id": "RUNALWAYS-AFTER-DEPLOYMENT",
"author": "DevOps",
"runAlways": true,
"failOnError": false,
"changes": [
{
"sql": {
"sql": "UPDATE public.table_name SET col1='VALUUE' WHERE id='id';"
}
}
]
}
}
]
}
原始 Keycloak liquibase 变更日志位于 Keycloak JAR 文件中,需要明确的是,这些文件是只读的。
您需要构建自己的 jar,其中包含 liquibase 变更日志和一些配置来告诉 Keycloak 运行这些脚本。
Keycloak 使用 SPI(服务提供商接口)系统来扩展服务器,在您的情况下,您需要实现
JpaEntityProvider
,其中包含一个方法来告诉 Keycloak liquibase 更改日志的位置。
示例:
public class ExampleJpaEntityProvider implements JpaEntityProvider {
// List of your JPA entities.
@Override
public List<Class<?>> getEntities() {
return Collections.emptyList();
}
// This is used to return the location of the Liquibase changelog file.
// You can return null if you don't want Liquibase to create and update the DB schema.
@Override
public String getChangelogLocation() {
return "META-INF/example-changelog.xml";
}
// Helper method, which will be used internally by Liquibase.
@Override
public String getFactoryId() {
return "sample";
}
...
}
如果您将 SPI jar 放在以下文件夹中,Keycloak 将自动部署它们:
standalone/deployments/
这是特定于 JpaEntityProvider 的文档:https://www.keycloak.org/docs/latest/server_development/index.html#_extensions_jpa
这里有一些关于如何构建和部署 SPI 的更一般性文档:https://www.keycloak.org/docs/latest/server_development/index.html#_providers