Docker中的应用程序服务器 - 使用IntelliJ进行战争部署

时间:2015-10-01 21:08:58

标签: java maven intellij-idea docker boot2docker

亲爱的程序员,您好

我正在考虑使用docker容器设置我的开发,因为我目前正在使用Windows,我的设置现在如下:

  • 包含已启动且已在运行的jboss的泊坞窗图像

  • 我的Windows文件系统上签出的hg repo已导入IntelliJ

  • 映射到泊坞窗图像中的部署文件夹的共享文件夹

每当我想部署我的战争时,我都会让IntelliJ将这个工件构建为与输出目录爆炸的战争到$ THE_SHARED_FODLER / mywar.war。然后我将使用mywar.war.deploy触摸同一个repo中的文件。由于这是与jboss docker镜像的部署文件夹共享的,因此启动的Jboss现在部署了我的战争。

然而,由于所有IntelliJ都知道我已经为文件系统构建了一个工件,如果我以正常方式部署战争,我无法得到任何好的支持(例如有一个本地jboss和一个部署爆炸工件的jboss-run-configuration)。前端的东西(html / css)总是可以用咕噜声或类似的东西来解决,但是当谈到jar-libs时,到目前为止我提出的最佳解决方案是:

  • 使用maven重建jar并将其复制到$ THE_SHARED_FOLDER / mywar.war / web-inf / lib /

  • 触摸文件mywar.war.redeploy

然而,这使得从代码更改到结果的转换时间大约为30秒o这里提出了一个非常开放的问题:开发一个在docker镜像中运行的应用程序服务器的好方法是什么?今天怎么样?您是否尝试过类似的东西,并认为Docker容器不适合这样做?

非常欢迎有关该主题的任何意见: - )

Brgrgs 史蒂夫电视

1 个答案:

答案 0 :(得分:6)

以下是我如何解决你正在崛起的问题:

  • 假设您使用Intellij Docker plugin - 自Intellij 14.1起支持它
  • 我正在使用maven将war复制到位于我的项目web-app下的名为docker的目录中。
  • docker目录包含用于构建Docker镜像的Dockerfile
  • 在Docker文件中,我将打包的war文件复制到docker镜像,创建管理用户以访问端口9990上的管理控制台并加载JBoss

  • Dockerfile内容:

    
    FROM jboss/wildfly
    MAINTAINER e.dahari@company.com
    ADD your-awesome-app.war /opt/jboss/wildfly/standalone/deployments/
    RUN /opt/jboss/wildfly/bin/add-user.sh admin Admin#70365 --silent
    CMD ["/opt/jboss/wildfly/bin/standalone.sh", "-b", "0.0.0.0", "-bmanagement", "0.0.0.0"]

  • 现在您需要创建一个设置文件container_settings.json。此文件包含运行您构建的Docker镜像的参数:

    
    {
        "_comment" : "My service",
        "Image": "your-awesome-app-name",
        "HostConfig": {
            "PortBindings":{
                "9990/tcp": [{ "HostIp": "0.0.0.0", "HostPort": "9990" }]
        },
        "RestartPolicy": { "Name": "on-failure", "MaximumRetryCount": 5 }
    }

  • 按照所述here
  • 打开Intellij Run/Debug Configurations并添加新的Docker Deployment
  • container_settings.json的路径应放在用户界面中的Container settings字段
  • 一旦你完成了。您可以运行配置,它将使用您刚刚构建的新的awesome-app.war构建Docker容器。

请注意,首次构建Docker镜像后,由于Docker缓存图像更改,因此连续配置运行速度要快得多。
由于Docker镜像中唯一的更改是war文件,因此下一个配置运行只会传输图像的这一部分。

一般情况下,当Docker文件中的每个操作都被缓存时,将最多变化的组件放在Docker文件中是很重要的。

希望我能帮到你。

相关问题