无法连接到 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实例

无法使用 SSH 连接到 docker 容器 [关闭]

Angular 无法连接到 docker compose 中的 Spring Boot 端点

无法连接到 Docker 容器

flyway 无法连接到 docker-entrypoint-initdb.d 脚本中的 postgres 容器

无法从主机连接到 dockerised Vue CLI 服务