如何使用 CLI 将模块添加到 Wildfly

Posted

技术标签:

【中文标题】如何使用 CLI 将模块添加到 Wildfly【英文标题】:How to add module to Wildfly using CLI 【发布时间】:2015-11-26 18:13:16 【问题描述】:

我正在尝试使用 postgres 数据源创建 Wildfly docker 映像。

当我构建 dockerfile 时,当我尝试安装 postgres 模块时,它总是失败并显示 Permission Denied。

我的 dockerfile 看起来是这样的:

FROM wildflyext/wildfly-camel

RUN /opt/jboss/wildfly/bin/add-user.sh admin admin --silent
ADD postgresql-9.4-1201.jdbc41.jar /tmp/
ADD config.sh /tmp/
ADD batch.cli /tmp/
RUN /tmp/config.sh

调用如下:

#!/bin/bash

JBOSS_HOME=/opt/jboss/wildfly
JBOSS_CLI=$JBOSS_HOME/bin/jboss-cli.sh
JBOSS_MODE=$1:-"standalone"
JBOSS_CONFIG=$2:-"$JBOSS_MODE.xml"

function wait_for_wildfly() 
  until `$JBOSS_CLI -c "ls /deployment" &> /dev/null`; do
    sleep 10
  done


echo "==> Starting WildFly..."
$JBOSS_HOME/bin/$JBOSS_MODE.sh -c $JBOSS_CONFIG > /dev/null &

echo "==> Waiting..."
wait_for_wildfly

echo "==> Executing..."
$JBOSS_CLI -c --file=`dirname "$0"`/batch.cli  --connect

echo "==> Shutting down WildFly..."
if [ "$JBOSS_MODE" = "standalone" ]; then
  $JBOSS_CLI -c ":shutdown"
else
  $JBOSS_CLI -c "/host=*:shutdown"
fi

还有

batch

module add --name=org.postgresql --resources=/tmp/postgresql-9.4-1201.jdbc41.jar --dependencies=javax.api,javax.transaction.api
/subsystem=datasources/jdbc-driver=postgresql:add(driver-name=postgresql,driver-module-name=org.postgresql,driver-xa-datasource-class-name=org.postgresql.xa.PGXADataSource)

run-batch

构建时的输出是:

==> 开始 WildFly... ==> 等待... ==> 正在执行...无法在文件系统上找到将 /tmp/postgresql-9.4-1201.jdbc41.jar 复制到的文件 /opt/jboss/wildfly/modules/org/postgresql/main/postgresql-9.4-1201.jdbc41.jar: /tmp/postgresql-9.4-1201.jdbc41.jar(权限被拒绝)

需要哪些权限,我在哪里设置权限?

谢谢

【问题讨论】:

【参考方案1】:

jboss 用户(来自父图像的用户)似乎无法读取 JAR 文件。 postgresql-9.4-1201.jdbc41.jar 添加到 root 用户下 - 在 this GitHub discussion 中查找详细信息。

你可以

在将其添加到图像之前向 JAR 文件添加权限 或添加后对镜像中的JAR文件添加权限 或更改图片中文件的所有权

最简单的解决方案可能是第一个。其他 2 个解决方案也需要将用户切换到 root(dockerfile 中的USER root),然后再切换回 jboss。

【讨论】:

谢谢。在添加之前更改 jar 的权限让我更进一步。现在我得到:The batch failed with the following error (you are remaining in the batch editing mode to have a chance to correct the error): "WFLYCTL0062: Composite operation failed and was rolled back. Steps that failed:" => "Operation step-1" => "WFLYJCA0041: Failed to load module for driver [org.postgresql]" 您的驱动程序有正确的 JAR 吗?这个对我有用。尽管如此,您不需要在 batch.cli 中使用批处理模式(因为“模块添加”是一个命令,而不是一个可以在批处理中使用的操作 - 所以你有一个单一操作的批处理)。跨度> 嗨@kwart,感谢您的帮助。我正在使用您提到的相同驱动程序 - postgresql-9.4-1201.jdbc41.jar 。您介意分享用于添加驱动程序的 cli 命令吗?我正在使用批处理,因为我想 1)添加驱动程序然后 2)添加数据源。 我有一点不同的驱动程序的 JAR 名称 1201-jdbc41 而不是 1201.jdbc41 (即破折号用作分隔符而不是点)尝试下载此版本:central.maven.org/maven2/org/postgresql/postgresql/… 关于 batch.cli 文件 - 只需从中删除“batch”和“run-batch”行。它会正常工作 - "module add" 命令应该阻塞,直到它完成,然后 ":add" 操作被处理。 天啊!这个答案救了我的命。我正要放弃,因为整个设置看起来完全正确,但没有任何效果。谁会想到文件权限?该死的!【参考方案2】:

这里有一个建议:制作一个这样的 cli 文件:

connect
module add --name=sqlserver.jdbc --resources=@INSTALL_FOLDER@/libext/jtds-1.3.1.jar --dependencies=javax.api,javax.transaction.api
/subsystem=datasources/jdbc-driver=sqlserver:add(driver-module-name=sqlserver.jdbc,driver-name=sqlserver,driver-class-name=@JDBC_DRIVER@)
/subsystem=datasources/data-source=@DATASOURCENAME@:add(jndi-name=java:jboss/@JNDI_NAME@,enabled="true",use-java-context="true",driver-name=sqlserver,connection-url="@JDBC_URL@",user-name=@JDBC_USER@,password=@JDBC_PASSWORD@,validate-on-match=true,background-validation=true)

用我们自己的值替换@VAR@......它应该可以工作! 请注意,JBOSS/Wildfly 10 默认相对于 jar --resources 认为是相对路径,但 wildfly 8 认为绝对路径可能会让你感到奇怪! ;-)

干杯!

【讨论】:

@INSTALL_FOLDER@ 是如何设置的?

以上是关于如何使用 CLI 将模块添加到 Wildfly的主要内容,如果未能解决你的问题,请参考以下文章

如何将 https-listener 添加到 WildFly 的默认服务器?

如何使用 jboss-cli 在 WildFly 17 中创建 JMS 队列

如何使用 Java 代码使用 jboss-cli 命令将 EAR 文件部署到 wildfly-17.0.1 服务器

如何在wildfly 8.2 Final中将lib添加到模块中?

如何通过脚本部署模块/提供程序/spi?

如何在 Wildfly 中使用 CLI 设置消息传递子系统