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

ste*_*eTV 1 java intellij-idea maven docker boot2docker

亲爱的程序员你好,

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

  • 一个docker镜像,包括一个已经启动并已经运行的jboss

  • 在我的Windows文件系统上签出了hg repo,导入到IntelliJ中

  • 共享文件夹,映射到docker镜像中的deploymentfolder

每当我想部署我的战争时,我都会让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 stevie电视

Eya*_*ari 6

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

  • 假设您正在使用Intellij Docker插件 - 从Intellij 14.1开始支持它
  • 我正在使用maven将war复制到名为docker位于我的项目web-app下的目录.
  • docker目录包含Dockerfile用于构建Docker镜像 的目录
  • 在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 }
    }

  • 打开的IntelliJ Run/Debug Configurations并添加一个新的Docker Deployment描述在这里
  • container_settings.json应将路径放置在Container settingsUI 中的字段中
  • 完成后.您可以运行配置,它将使用您刚刚构建的新的awesome-app.war构建Docker容器.

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

通常,最重要的是将最多变化的组件放在Docker文件中,因为Docker文件中的每个操作都被缓存.

希望我能帮到你.