【问题标题】:Cannot connect to Wildfly in Dockerfile无法连接到 Dockerfile 中的 Wildfly
【发布时间】:2020-03-14 16:38:50
【问题描述】:

我正在为官方 keycloak docker 映像创建一个带有扩展名的自定义 Dockerfile。我想更改网络上下文并添加一些自定义提供程序。 这是我的 Dockerfile:

FROM jboss/keycloak:7.0.0

COPY startup-config.cli /opt/jboss/tools/cli/startup-config.cli

RUN /opt/jboss/keycloak/bin/jboss-cli.sh --connect --controller=localhost:9990 --file="/opt/jboss/tools/cli/startup-config.cli"

ENV KEYCLOAK_USER=admin
ENV KEYCLOAK_PASSWORD=admin

和 startup-config.cli 文件:

/subsystem=keycloak-server/:write-attribute(name=web-context,value="keycloak/auth")
/subsystem=keycloak-server/:add(name=providers,value="module:module:x.y.z.some-custom-provider")

不幸的是我收到这样的错误:

The controller is not available at localhost:9990: java.net.ConnectException: WFLYPRT0053: Could not connect to remote+http://localhost:9990. The connection failed: WFLYPRT0053: Could not connect to remote+http://localhost:9990. The connection failed: Connection refused
The command '/bin/sh -c /opt/jboss/keycloak/bin/jboss-cli.sh --connect --controller=localhost:9990 --file="/opt/jboss/tools/cli/startup-config.cli"' returned a non-zero code: 1

这是无效的本地主机的问题吗?我应该如何引用管理 API?

编辑:我也尝试使用ENTRYPOINT 而不是RUN,但在容器初始化期间发生了同样的错误。

【问题讨论】:

    标签: java docker jboss wildfly keycloak


    【解决方案1】:

    构建 Docker 映像时,WildFly 管理界面不可用。您唯一的选择是以嵌入式模式启动 CLI,如Running CLI commands in WildFly Dockerfile 所述。 更高级的方法是使用 S2I 安装脚本来触发 CLI 命令。

    【讨论】:

      【解决方案2】:

      您正在尝试让 Wildfly 在此处在构建时加载您的自定义配置文件。问题是,Wildfly 服务器在 Dockerfile 构建时没有运行。

      Wildfly 实际上已经为您介绍了有关自动加载自定义配置的内容,内置支持您想要做的事情。您只需将配置文件放在图像内的“神奇位置”即可。

      你需要把你的配置文件放在这里:

      /opt/jboss/startup-scripts/

      所以你的Dockerfile 看起来像这样:

      FROM jboss/keycloak:7.0.0
      
      COPY startup-config.cli /opt/jboss/startup-scripts/startup-config.cli
      
      ENV KEYCLOAK_USER=admin
      ENV KEYCLOAK_PASSWORD=admin
      

      摘自keycloak documentation:

      使用 Dockerfile 添加自定义脚本

      可以通过以下方式添加自定义脚本 创建自己的 Dockerfile:

      FROM keycloak 
      COPY custom-scripts/ /opt/jboss/startup-scripts/
      

      现在您可以简单地启动映像,keycloak 中的内置功能(真的是 Wildfly 功能)将在该特定目录中查找配置,然后尝试加载它。

      使用最终解决方案编辑评论:

      虽然原始答案完全解决了能够将配置传递给服务器的问题,但脚本内容仍然存在问题。启动容器时收到以下错误:

      =========================================================================
      Executing cli script: /opt/jboss/startup-scripts/startup-config.cli
      No connection to the controller.
      =========================================================================
      

      问题出在startup-config.cli 脚本中,其中缺少jboss 命令embed-server,需要启动与jboss 实例的连接。还缺少关闭 stop-embedded-server 命令。有关以这种方式配置 jboss 的更多信息,请参阅此处的文档:CHAPTER 8. EMBEDDING A SERVER FOR OFFLINE CONFIGURATION

      最终脚本:

      embed-server --std-out=echo
      /subsystem=keycloak-server/theme=defaults/:write-attribute(name=cacheThemes,value=false)
      /subsystem=keycloak-server/theme=defaults/:write-attribute(name=cacheTemplates,value=false)
      stop-embedded-server
      

      【讨论】:

      • 你是对的。但是在将脚本添加到/opt/jboss/startup-scripts/ 后,日志中出现以下消息:========================================================================= Executing cli script: /opt/jboss/startup-scripts/startup-config.cli No connection to the controller. ========================================================================= 并且网络上下文没有改变。
      • 你能尽量让你的配置脚本尽可能小吗?你用什么命令来启动 docker 镜像?
      • docker build -t custom-keycloak . 在 Dockerfile 目录和docker run -p 8080:8080 {docker-image-hash}
      • 嘿@dev123。你找到解决办法了吗?我遇到了同样的问题,同时通过docker-compose 启动keycloak 图像并使用volumes 添加脚本
      • 好的,我想通了。我的解决方案是在 cli 脚本中使用 embede-server 命令:embed-server --std-out=echo /subsystem=keycloak-server/theme=defaults/:write-attribute(name=cacheThemes,value=false) /subsystem=keycloak-server/theme=defaults/:write-attribute(name=cacheTemplates,value=false) stop-embedded-server
      猜你喜欢
      • 2018-06-30
      • 2021-12-10
      • 2014-12-04
      • 2023-03-15
      • 1970-01-01
      • 2015-11-24
      • 2017-03-25
      • 2021-10-04
      • 2015-01-10
      相关资源
      最近更新 更多