使用 Docker 时未加载 Keycloak SPI 提供程序和层

Posted

技术标签:

【中文标题】使用 Docker 时未加载 Keycloak SPI 提供程序和层【英文标题】:Keycloak SPI Providers and layers not loading when using Docker 【发布时间】:2019-12-04 03:07:04 【问题描述】:

我正在尝试使用一些自定义内容(例如 logback 扩展)设置 docker 映像,因此我有一些 CLI 脚本,例如:

/subsystem=logging: remove()
/extension=org.jboss.as.logging: remove()

/extension=com.custom.logback: add()
/subsystem=com.custom.logback: add()

我还有 CLI 脚本来配置数据源池、主题、在 keycloak-server 子系统上添加一些 SPI 等。我将这些脚本放在 /opt/jboss/startup-scripts 目录中。但是,当我创建容器时,事情并不顺利。脚本未按预期加载,keycloak 以错误开始,未加载领域使用的密码策略等提供程序。

当我使用独立 Keycloak 时,所有 SPI 提供程序都可以正常加载,如下所示:

2019-07-25 18:27:07.906 WARN  [org.keycloak.services] (ServerService Thread Pool -- 65) KC-SERVICES0047: custom-password-policy (com.custom.login.password.PasswordSecurityPolicyFactory) is implementing the internal SPI password-policy. This SPI is internal and may change without notice
2019-07-25 18:27:07.909 WARN  [org.keycloak.services] (ServerService Thread Pool -- 65) KC-SERVICES0047: custom-event (com.custom.event.KeycloakServerEventListenerProviderFactory) is implementing the internal SPI eventsListener. This SPI is internal and may change without notice
2019-07-25 18:27:08.026 WARN  [org.keycloak.services] (ServerService Thread Pool -- 65) KC-SERVICES0047: custom-mailer (com.custom.mail.MessageSenderProviderFactory) is implementing the internal SPI emailSender. This SPI is internal and may change without notice
2019-07-25 18:27:08.123 WARN  [org.keycloak.services] (ServerService Thread Pool -- 65) KC-SERVICES0047: custom-user-domain-verification (com.custom.login.domain.UserDomainVerificationFactory) is implementing the internal SPI authenticator. This SPI is internal and may change without notice
2019-07-25 18:27:08.123 WARN  [org.keycloak.services] (ServerService Thread Pool -- 65) KC-SERVICES0047: custom-recaptcha-username-password (com.custom.login.domain.RecaptchaAuthenticatorFactory) is implementing the internal SPI authenticator. This SPI is internal and may change without notice

如果我使用与 Docker 相同的包,使用 jboss/keycloak:6.0.1 作为镜像库,则不会加载提供程序。我使用作为模块,在$JBOSS_HOME/modules 文件夹中添加并配置如下脚本:

/subsystem=keycloak-server/: write-attribute(name=providers,value=[classpath:$jboss.home.dir/providers/*,module:com.custom.custom-keycloak-server])

/subsystem=keycloak-server/theme=defaults/: write-attribute(name=welcomeTheme,value=custom)
/subsystem=keycloak-server/theme=defaults/: write-attribute(name=modules,value=[com.custom.custom-keycloak-server])

/subsystem=keycloak-server/spi=emailSender/: add(default-provider=custom-mailer)

当我在容器内执行脚本时一切正常。

我尝试在构建自定义映像时使用卷来映射 jar 包和提供程序并复制 jar,但这些方法都不起作用。

我使用的是jboss:keycloak:6.0.1 docker 镜像和独立的 Keycloak 6.0.1,层和模块放在相同的目录中。

我做错了什么?将 SPI 提供程序与 Docker 一起使用有什么技巧,或者该映像不是用于生产或此类需求的?

【问题讨论】:

【参考方案1】:

好的,我找到了发生这种情况的原因

来自opt/jboss/tools/docker-entrypoint.sh

#################
# Configuration #
#################

# If the server configuration parameter is not present, append the HA profile.
if echo "$@" | egrep -v -- '-c |-c=|--server-config |--server-config='; then
    SYS_PROPS+=" -c=standalone-ha.xml"
fi

它将作为集群启动 keycloak,因为我认为他们认为standalone as not safe for production

单机操作模式仅在您想运行一个时有用,并且 只有一个 Keycloak 服务器实例。它不适用于集群 部署和所有缓存都是非分布式的且仅限本地。它是 不建议您在生产中使用独立模式 有单点故障。如果您的独立模式服务器运行 down,用户将无法登录。这种模式真的只有 对试驾和玩 Keycloak 的功能很有用 块引用

要保持“独立模式”,请覆盖图像以添加属性-c standalone.xml 作为参数:

CMD ["-b", "0.0.0.0", "-c", "standalone.xml"]

【讨论】:

但是集群模式下怎么办呢?【参考方案2】:

https://hub.docker.com/r/jboss/keycloak/:

要添加自定义提供程序,请扩展 Keycloak 映像并将提供程序添加到 /opt/jboss/keycloak/standalone/deployments/ 目录。

您是否为您的自定义提供商使用了/opt/jboss/keycloak/standalone/deployments/ 的音量?

【讨论】:

正如问题中所说,我将提供程序用作模块,我将 CLI 脚本中添加模块作为提供程序的部分放在 keycloak-server 子系统上 我直接在 Dockerfile 上的 /opt/jboss/keycloak/modules 添加模块,而不是使用卷 我遇到了下一个问题:14:16:01,788 ERROR [org.jboss.as.controller.management-operation] (DeploymentScanner-threads - 2) WFLYCTL0013: Operation ("deploy") failed - address: ([("deployment" => "apple-social-identity-provider-1.0.4.jar")]) - failure description: "WFLYCTL0080: Failed services" => "jboss.deployment.unit.\"apple-social-identity-provider-1.0.4.jar\".STRUCTURE" => "WFLYSRV0153: Failed to process phase STRUCTURE of deployment \"apple-social-identity-provider-1.0.4.jar\" 或:appears to be incomplete and is not progressing toward completion. This content cannot be auto-deployed.

以上是关于使用 Docker 时未加载 Keycloak SPI 提供程序和层的主要内容,如果未能解决你的问题,请参考以下文章

在 Nginx 代理后面时,Keycloak Docker Instace 中的 X-Frame-Options 拒绝加载

我收到状态 401 错误:当我尝试通过 keycloak 调用我的 Secured API 时未授权

使用 docker [MySQL] 运行 keycloak 时出错

使用docker和java spring时keycloak认证问题

使用 docker-compose 时导入 keycloak 配置文件

Keycloak docker HTTPS-REQUIRED with nginx ssl