无法连接到 Dockerfile 中的 Wildfly
Posted
技术标签:
【中文标题】无法连接到 Dockerfile 中的 Wildfly【英文标题】:Cannot connect to Wildfly in Dockerfile 【发布时间】: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
,但在容器初始化期间发生了同样的错误。
【问题讨论】:
【参考方案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
以上是关于无法连接到 Dockerfile 中的 Wildfly的主要内容,如果未能解决你的问题,请参考以下文章
从dockerfile构建的docker容器运行时无法连接到Rabbit MQ实例
Angular 无法连接到 docker compose 中的 Spring Boot 端点