【问题标题】:Maven run docker image with java ee applicationMaven 使用 java ee 应用程序运行 docker 映像
【发布时间】:2017-01-29 09:36:39
【问题描述】:

我有一个正在运行的 java ee 应用程序,它使用 wildfly 和 mysql。现在我听说 docker 正在使用每个人,而且效率很高,所以我决定对我的开发环境进行 docker 化。听起来比实际简单。

到目前为止我有什么:

  • 用于将我的应用打包成 .war 文件的 Maven
  • Arquillian 单元测试在我本地安装的 Wildfly 实例上运行测试

我想要什么:

  • 使用预定义的 docker 映像(jboss/wildfly,...)来运行我的应用程序。
  • 还在 docker 容器中运行我的测试。

我开始使用 maven-docker-plugin 构建一个 docker 映像:

<plugin>
   <groupId>com.spotify</groupId>
   <artifactId>docker-maven-plugin</artifactId>
   <version>0.4.13</version>
   <configuration>
      <imageName>netbeans/sampleapplication</imageName>
      <dockerDirectory>src/main/docker</dockerDirectory>
      <resources>
         <resource>
            <targetPath>/</targetPath>
            <directory>${project.build.directory}</directory>
            <include>${project.build.finalName}.war</include>
         </resource>
      </resources>
      <execution>
         <id>build-image</id>
         <phase>package</phase>
         <goals>
            <goal>build</goal>
         </goals>
      </execution>
   </configuration>
</plugin>

Dockerfile:

FROM jboss/wildfly
COPY *.war /opt/jboss/wildfly/standalone/deployments/app.war
EXPOSE 8080 9990

Maven 命令:clean package docker:build。 我可以使用我的 docker-maschine url 访问应用程序服务器,而不像以前使用 localhost。 最后,我只想使用一个 Maven 命令:

  1. 构建应用程序
  2. 构建 docker 镜像(wildfly、mysql...)
  3. 运行 arquillian junit 测试
  4. 部署应用程序并通过 localhost:8080 公开它
  5. 进行新部署时停止容器

我真的很挣扎。有人知道如何做到这一点吗?

【问题讨论】:

    标签: mysql maven docker wildfly


    【解决方案1】:

    除了直接使用 JBoss Wildfly 容器之外,您还可以查看Wildfly Swarm。它是 Wildfly 的一个单独发行版,包含更多关于 docker 的好东西。

    【讨论】:

    • 我一定会看看的!看起来很有前途。让我们看看它如何与单独的数据库容器一起使用。
    【解决方案2】:

    没有直接的方法可以做到这一点 - 因为一些 docker 任务不能轻易地映射到 maven 阶段。因此,您需要选择适合您的首选工作方式。

    所以一些想法可能会导致解决方案:

    spotify-docker-maven 插件没有 mojo (maven goals) 来运行图像。它的主要任务是创建和发布 docker 镜像。

    因此,要运行映像,您可以简单地编写一些 bash 脚本(因为它们很简单,它们可以使用 git bash 命令行在 Linux 甚至 Windows 上运行)。您可以使用maven-exec-plugin 执行这些脚本。

    要将其正确映射到 maven 生命周期有点棘手。

    与此最匹配的阶段(仅我认为)是integration-test phase。该阶段具有集成测试前阶段、集成测试阶段和集成测试后阶段。这个想法是在预阶段启动容器。然后在集成测试阶段使用failsafe-plugin 运行测试(不要让构建失败!)并在后期清理容器。在前期阶段清理该项目的容器也是一个好主意 - 以防一些僵尸容器留下来。

    这些步骤可以放入配置文件中。由于集成测试也需要集成测试阶段,因此最终会使用不同的配置文件执行“maven verify”(mvn verify && mvn verify -P docker-tests && mvn -P docker-other-tests)。

    另一种方法是使用maven plugin created by fabric8。 这个插件比 spotify 创建的插件要复杂一些(再次:我的意见)。但它伴随着更多的目标。

    使用插件提供的&lt;packaging&gt;docker&lt;/packaging&gt;,docker run 和 stop 目标是already mapped to the lifecycle

    这两个插件最终在 pom.xml 中都具有相似的复杂性 - 只是使用 fabric 插件阅读更多。但是有一些不错的examples and a good user manual

    所以这是我想到的两个选项。希望这会有所帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      • 2015-02-05
      • 2011-01-06
      • 2016-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多