Maven使用java ee应用程序运行docker镜像

时间:2016-09-21 08:35:59

标签: mysql maven docker wildfly

我有一个运行java ee的应用程序,它使用的是wildfly和mysql。现在我听说docker正在使用所有人,它非常高效,所以我决定将我的开发环境停靠。听起来比较容易。

到目前为止:

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

我想要的是什么:

  • 使用预定义的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 tests
  4. 部署应用程序并通过localhost:8080
  5. 公开它
  6. 如果进行新部署,则停止容器
  7. 我真的很挣扎。有人知道如何做到这一点?

2 个答案:

答案 0 :(得分:3)

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

所以有些想法希望能够找到解决方案:

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

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

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

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

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

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

使用插件提供的<packaging>docker</packaging>,docker运行和停止目标为already mapped to the lifecycle

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

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

答案 1 :(得分:1)

或者直接使用JBoss Wildfly容器,您也可以查看Wildfly Swarm。它是Wildfly的独立发行版,有更多关于docker的好东西。