如何编写 Dockerfile 将我的 war 文件部署到 jboss 7.2 中?

Posted

技术标签:

【中文标题】如何编写 Dockerfile 将我的 war 文件部署到 jboss 7.2 中?【英文标题】:How to write a Dockerfile to deploy my war file into jboss 7.2? 【发布时间】:2021-09-26 14:55:54 【问题描述】:

我想编写一个 Dockerfile 来将我的 war 文件部署到 jboss7.2 中。 在我现有的 jboss 7.2 中,我们使用了密钥库文件以及数据库服务器配置。 那么,我的 dockerfile 将如何进行这些配置呢?

【问题讨论】:

【参考方案1】:

其实Dockerfile只负责镜像的构建,不能包含上面提到的所有配置。

这是你案例中的 Dockerization 设计

    Dockerfile

您的 Dockerfile 需要有一个带有 JDK 和 JBoss 的基础镜像以及您喜欢的 Linux 发行版(请查看 DockerHub 了解此内容),并且您需要复制您的应用程序战争和standalone.xml 配置(改编于第 2 部分)在目标目录中,然后最后设置一个入口点或命令来启动应用程序服务器。

这是一个例子:

FROM jboss/wildfly:16.0.0.Final

USER jboss
WORKDIR /home/jboss

#Copy your application war and configuration file  :  
COPY ./app_runtime_resources  <runtime_path_in_container>

#Launch the application server with the appropriate options 
CMD $JBOSS_HOME/bin/standalone.sh  -c app-standalone.xml \
                 -Djboss.server.base.dir=<runtime_path_in_container> $ADDITIONAL_OPTS
    数据库凭据

对于数据库凭据,最简单的方法是将它们作为环境变量传递给容器:

 docker run -e DB_URL=<myURL>  -e DB_USERNAME=<myuser> \
            -e DB_PASSWORD=<mypassword>  myAppImage:latest

然后您需要更改standalone.xml 中的属性值以指向环境变量,Jboss 支持环境变量作为配置文件中的属性,使用“env”关键字如下$env.ENV_NAME。 这是数据源配置的示例:

     <datasources>
        <datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true" use-java-context="true" statistics-enabled="$wildfly.datasources.statistics-enabled:$wildfly.statistics-enabled:false">
            <connection-url>$env.DB_URL</connection-url>
            <driver>h2</driver>
            <security>
                <user-name>$env.DB_USERNAME</user-name>
                <password>$env.DB_PASSWORD</password>
            </security>
        </datasource>
        <drivers>
            <driver name="h2" module="com.h2database.h2">
                <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
            </driver>
        </drivers>
    </datasources>

您也可以添加默认值,有关“env.ENV”属性选项的更多信息,请查看本指南How to use environment variables in WildFly configuration (standalone.xml or host.xml)。

重要提示:如果您要将应用程序部署为服务,请检查您的编排器是否支持机密以提高安全性。 Docker swarm 和 Kubernetes 都支持敏感数据的机密(这里是 docker swarm 的 example)。

    密钥库文件

对于 Keystore,您可以创建一个共享卷来处理 Keystore 文件 在 docker 运行命令中:-v &lt;keystore_files_path_localy&gt;:/app/Keystore

 docker run -e DB_URL=<myURL>  -e DB_USERNAME=<myuser> \
            -e DB_PASSWORD=<mypassword>  \
            -v <keystore_files_path_localy>:/app/keystore \
            myAppImage:latest

您还将在生产检查 docker volumes doc 中使用日志持久性卷以获取更多信息Use volumes, Docker docs。

【讨论】:

以上是关于如何编写 Dockerfile 将我的 war 文件部署到 jboss 7.2 中?的主要内容,如果未能解决你的问题,请参考以下文章

实战docker,编写Dockerfile定制tomcat镜像,实现web应用在线部署

实战docker,编写Dockerfile定制tomcat8镜像,实现web应用在线部署

如何将geoserver安装程序导出为war文件?

通过Dockerfile部署TomcatApacheNginxMySQL服务

Dockerfile 简单使用制作tomcat war 镜像包

如何在 Bluemix 中更改同一项目的 War 文件