如何更新 kecloak 12.0.4 映像的 Liquibase 脚本?

问题描述 投票:0回答:1

我正在尝试自定义我的 Keycloak docker 容器。 我使用

jboss/keycloak:12.0.4
作为我的 docker 镜像的基础镜像。

容器启动中包含的 Liquibase 脚本进行任何所需的更新后,我需要在一个特定表上运行 SQL 更新语句。

脚本位于图像中的什么位置?我好像找不到他们。

注意:我也很高兴收到替代方法。只要在keycloak服务器启动之前更新DB记录即可

我想添加的脚本看起来像这样:

db.changelog.postdeployment.json
{
  "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
1个回答
4
投票

原始 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

© www.soinside.com 2019 - 2024. All rights reserved.