【问题标题】:How to pass variable as attribute to xml configuration file in Wildfly with Docker如何使用 Docker 将变量作为属性传递给 Wildfly 中的 xml 配置文件
【发布时间】:2017-11-29 07:37:36
【问题描述】:

我正在尝试将值从 docker-compose.yml 文件动态传递到 Wildfly 配置。 我想要邮件配置的灵活性——只是为了快速更改地址、用户名或端口..

在这种情况下,我尝试通过从 docker-compose.yml 转发环境变量,通过 dockerfile 作为参数“-Dargumentname=$environmentvariable. 目前wildfly在开始时中断并出现错误:

[org.jboss.as.controller.management-operation](服务器服务线程 池——45)WFLYCTL0013:操作(“添加”)失败-地址:([ (“子系统”=>“邮件”), ("mail-session" => "default") ]) - 失败描述:“WFLYCTL0097: ssl 类型错误。应为 [BOOLEAN] 但为 STRING”

同样的情况,如果我尝试在 outbound-socket-binding 块中将 PORT 作为值传递。

我不知道如何将整数/布尔值从 docker-compose 文件传递​​到 Wildfly 配置。

docker-compose.yml(部分)

...
    services:
        some_service:
            image: image_name:tag
            environment:
             - USERNAME=some_username@...
             - PASSWORD=some_password
             - SSL=true // I also tried with value 1
             - HOST=smtp.gmail.com
             - PORT=465 // also doesn't work
...

Dockerfile:

FROM some_wildfly_base_image

# install cgroup-bin package
USER root
RUN apt-get update
RUN apt-get install -y cgroup-bin
RUN apt-get install -y bc

USER jboss
ADD standalone-myapp.xml /opt/jboss/wildfly/standalone/configuration/
ADD standalone.conf /opt/jboss/wildfly/bin/
ADD modules/ /opt/jboss/wildfly/modules/

RUN wildfly/bin/add-user.sh usr usr --silent

# Set the default command to run on boot
# This will boot WildFly in the standalone mode and bind to all interface
CMD [ "/opt/jboss/wildfly/bin/standalone.sh", "-c", "standalone-myapp.xml", "-Dmail.username=$USERNAME", "-Dmail.password=$PASSWORD", "-Dmail.ssl=$SSL", "-Drm.host=$HOST", "-Drm.port=$PORT" ]

独立-myapp.xml:

...
    <subsystem xmlns="urn:jboss:domain:mail:2.0">
        <mail-session name="default" jndi-name="java:jboss/mail/Default">
            <smtp-server password="${mail.password}" username="${mail.username}" ssl="${mail.ssl}" outbound-socket-binding-ref="mail-smtp"/>
        </mail-session>
    </subsystem>
...

    <outbound-socket-binding name="mail-smtp">
        <remote-destination host="${rm.host}" port="465"/>
    </outbound-socket-binding>
...

【问题讨论】:

    标签: docker configuration docker-compose wildfly dockerfile


    【解决方案1】:

    差不多了。在您的 docker 文件中,您已经定义了环境变量,因此您需要在 Wildfly 配置中将它们作为环境变量引用。最简单的方法是在您的环境变量前面加上 env. 前缀。因此,在您的示例中,您有环境变量 HOSTSSLUSERNAME... 您可以像这样在standalone.xml 中引用它们:

    <smtp-server password="${env.PASSWORD}" username="${env.USERNAME}" ssl="${env.SSL}" outbound-socket-binding-ref="mail-smtp"/> </mail-session>
    

    如果没有 env. 前缀,jboss/wildfly 将尝试将表达式解析为 jvm 属性,您必须将其指定为 jvm -D 标志。
    您还可以在表达式中使用默认值回退,例如:

    ssl="${env.SSL:true}"
    

    这样,ssl 将设置名为SSL 的环境变量的值,如果这样的变量不存在,服务器将回退到true
    快乐的黑客攻击

    【讨论】:

    • 非常感谢! env 的解决方案。前缀工作完美。早些时候,我尝试使用 jvm 属性来执行此操作(使用参数运行standalone.sh:“-Dmail.username=$USERNAME”、“-Dmail.password=$PASSWORD”、“-Dmail.ssl=$SSL”、“-Drm .host=$HOST", "-Drm.port=$PORT"),但我意识到没有括号 - { } 它将无法工作。而且您的解决方案也更加清晰和简单:)
    猜你喜欢
    • 1970-01-01
    • 2018-02-23
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    相关资源
    最近更新 更多