本文适用于将Maven用作JAVA应用程序的构建和依赖性管理工具的人员。 它将向您展示如何将Docker容器构建,标记和推送工作流集成到其现有的Maven构建管理生态系统中。
能够直接从Maven生命周期命令本身构建,标记和推动应用程序作为容器的功能是一件很酷的事情。 如果您尝试引入容器的功能来部署应用程序,并且可以使用Maven进行依赖管理的所有功能,那么这将使事情变得轻松快捷。
如果我们看一下将docker容器部署集成到Maven中的现有解决方案,那里有几种解决方案,例如spotify maven docker插件,fabric8io docker maven插件等。但是所有这些解决方案带来了不必要的复杂性,额外的学习难度以及太多更改为您现有的应用程序代码。 但是,有一种更简便的方法可以在不使用任何第三方插件的情况下实现这一目标。
如果您注意到Maven的Ant插件,它使我们可以运行外部命令。 因此,通过使用Ant插件,我们可以根据需要运行docker build,tag,push或任何命令。 我们要做的唯一一件事就是提供一个正确的Dockerfile,用于为您的应用程序构建Docker映像,并将必要的命令和Maven配置集构建到pom.xml文件中。
为了说明此过程涉及的步骤,我将使用一个示例JAVA应用程序。 它包含以下步骤中使用的所有代码示例。 您可以从这里克隆它。
步骤1 | 创建Dockerfile
Dockerfile应该存储在路径src / main / docker / Dockerfile中 您的JAVA应用程序。
#拉出基本图片
从 tomcat:8.0.30 - jre7
#维护者
维护人员“ ravindu@emojot.com”
#设置环境属性
ENV JAVA_OPTS = -环境=生产
#将war文件复制到tomcat webapps文件夹
COPY /dockermavensample.war/usr/local/tomcat/webapps/
步骤2 | 更新pom.xml以将所有与Docker相关的资源复制到目标目录中
我们可以使用maven-resource-plugin复制资源。
maven-resources-plugin
复制资源
验证
复制资源
$ {basedir} / target
src / main / docker
true
步骤3 | 更新pom.xml以允许通过Maven的Ant插件构建并标记Docker映像
< 插件 >
< groupId > org.apache.maven.plugins </ groupId >
< artifactId > maven-antrun-plugin </ artifactId >
< 版本 > 1.6 </ 版本 >
< 处决 >
< 执行 >
< id >准备包装</ id >
< 阶段 >包</ 阶段 >
< 继承 > false </ 继承 >
< 配置 >
< 目标 >
< exec可执行文件=“ docker” >
< arg value =“ build” />
< arg value =“-t” />
< arg value =“ dockermavensample :$ {project.version}” />
< arg value =“ target” />
</ exec >
</ target >
</ 配置 >
< 目标 >
< 目标 >运行</ 目标 >
</ 目标 >
</ 执行 >
</ 死刑 >
</ 插件 >
Maven的Ant插件将按照以下顺序在Maven生命周期的打包阶段中执行docker命令,该命令将从Dockerfile中构建docker映像,并在步骤2中将其复制到目标文件夹中。
docker build -t dockermavensample:1.0.0目标
步骤4 | 更新pom.xml文件以允许将Docker Image推送到远程Docker存储库
对于生产的理想选择,您必须将Docker映像推送到自己的私有Docker注册表中,或者使用第三方Docker映像存储库,该存储库允许存储私有Docker映像,以便其他人无法直接提取Docker映像。
org.apache.maven.plugins
maven-antrun-plugin
1.6
安装
假
<exec可执行文件=“ docker ”>
<arg value =“标签” />
<arg value =“ dockermavensample:$ {project.version} ” />
<arg value =“ dockermavensample:latest ” />
<exec可执行文件=“ docker ”>
<arg value =“ push ” />
<arg value =“ dockermavensample:latest ” />
运行
除了上述步骤,您可能还希望控制在Maven生命周期中如何运行这些与docker相关的命令。 为此,您可以使用Maven配置文件在逻辑上划分以上插件定义。 然后仅在与该操作相关的配置文件被调用时才执行那些操作。
看一下以下样本概要文件:
< 个人资料 >
< id > dockerBuild </ id >
< 构建 >
< 插件 >
< 插件 >
< artifactId > maven-resources-plugin </ artifactId >
< 处决 >
< 执行 >
< id >复制资源</ id >
< 阶段 >验证</ 阶段 >
< 目标 >
< 目标 >复制资源</ 目标 >
</ 目标 >
< 配置 >
< outputDirectory > $ {basedir} / target </ outputDirectory >
< 资源 >
< 资源 >
< 目录 > src / main / docker </ 目录 >
< 过滤 > true </ 过滤 >
</ 资源 >
</ 资源 >
</ 配置 >
</ 执行 >
</ 死刑 >
</ 插件 >
< 插件 >
< groupId > org.apache.maven.plugins </ groupId >
< artifactId > maven-antrun-plugin </ artifactId >
< 版本 > 1.6 </ 版本 >
< 处决 >
< 执行 >
< id >准备包装</ id >
< 阶段 >包</ 阶段 >
< 继承 > false </ 继承 >
< 配置 >
< 目标 >
< exec可执行文件=“ docker” >
< arg value =“ build” />
< arg value =“-t” />
< arg value =“ dockermavensample:$ {project.version} ” />
< arg value =“ target” />
</ exec >
</ target >
</ 配置 >
< 目标 >
< 目标 >运行</ 目标 >
</ 目标 >
</ 执行 >
</ 死刑 >
</ 插件 >
</ 插件 >
</ build >
< 激活 >
< activeByDefault > true </ activeByDefault >
</ 激活 >
</ 个人资料 >
< 个人资料 >
< id > dockerRelease </ id >
< 构建 >
< 插件 >
< 插件 >
< groupId > org.apache.maven.plugins </ groupId >
< artifactId > maven-antrun-plugin </ artifactId >
< 版本 > 1.6 </ 版本 >
< 处决 >
< 执行 >
< 阶段 >安装</ 阶段 >
< 继承 > false </ 继承 >
< 配置 >
< 目标 >
< exec可执行文件=“ docker” >
< arg value =“ tag” />
< arg value =“ dockermavensample:$ {project.version}” />
< arg value =“ dockermavensample:latest” />
</ exec >
< exec可执行文件=“ docker” >
< arg value =“ push” />
< arg value =“ dockermavensample:latest” />
</ exec >
</ target >
</ 配置 >
< 目标 >
< 目标 >运行</ 目标 >
</ 目标 >
</ 执行 >
</ 死刑 >
</ 插件 >
</ 插件 >
</ build >
</ 个人资料 >
完成上述步骤后,只需运行
mvn clean install -P dockerBuild,docker发布
现在,您的JAVA应用程序被打包为一个容器,并被推送到一个远程docker存储库中。 您可以通过运行以下命令来测试创建的映像是否正常工作,




如您所见,我们可以使用已经可用的Maven功能和插件来创建结构良好的构建管道,以将我们的应用程序部署为容器。
示例项目:
rav94 / dockermavensample
通过Maven展示自动化容器部署的演示项目– rav94 / dockermavensample github.com
谢谢阅读!