使用 Maven 服务,我们可以很方便的处理 JAVA 工程的软件包依赖和编译打包。如果我们构建的工程是运行在 Docker 容器化平台中的话,我们后面还需要将构建好的包,打到镜像中并推送到镜像仓库。第二个步骤中的制作容器镜像和推送到远程仓库的操作,我们可以编写到 Maven 服务的配置文件中,从而减少我们的手动操作,提高效率。
创建了一个 dingtalk 工程,用于将 Prometheus alert 的 Webhook 警报信息转发到钉钉上去。在这一步中,工程的POM 文件中只需要配置好需要的依赖(dependencies)即可。
mvn package
命令将项目打包成jar 或者war 包。
<properties>
<java.version>1.8</java.version>
<docker.repostory>registry-vpc.cn-shenzhen.aliyuncs.com</docker.repostory>
<docker.registry.name>devops-lyz</docker.registry.name>
</properties>
<build>
#指定资源文件
#Directory 指定资源dockerfile 文件的路径
#targetPath 目标文件,指定dockerfile 拷贝的目标地址和JAR 包文件生成的目录
<resources>
<resource>
<directory>${project.basedir}/src/main/docker</directory>
<filtering>true</filtering>
<includes>
<include>**/Dockerfile</include>
</includes>
<targetPath>${project.basedir}/target/docker</targetPath>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
#Maven 用于创建容器镜像使用到的插件
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
#镜像的名称
<imageName>${docker.repostory}/${docker.registry.name}/${project.artifactId}</imageName>
#镜像的目录
<dockerDirectory>${project.basedir}/target/docker</dockerDirectory>
<imageTags>
#镜像的版本信息
<imageTag>${project.version}</imageTag>
</imageTags>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.${project.packaging}</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
打包命令: mvn -f pom_2_by_dockerfile.xml clean package -DskipTests docker:build
绑定 Docker 命令到 Maven 各个阶段,可以把 Docker 分为 build、tag、push,然后分别绑定 Maven 的 package、deploy 等阶段。这样,我们只需要执行 mvn deploy 就可以完成整个 build、tag、push 操作了。
当我们执行 mvn build 就只完成 build、tag 操作。
此外当想跳过某些步骤或者只执行某个步骤时,不需要修改 POM 文件,只需要指定跳过 docker 某个步骤即可。
<plugin>
#Maven 用于创建容器镜像使用到的插件
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
<execution>
<id>tag-image</id>
<phase>package</phase>
<goals>
<goal>tag</goal>
</goals>
</execution>
<execution>
<id>push-image</id>
<phase>deploy</phase>
<goals>
<goal>push</goal>
</goals>
</execution>
</executions>
</plugin>
当我们执行 mvn package 时,执行 build、tag 操作。当执行 mvn deploy 时,执行 build、tag、push 操作。
如果想跳过 docker 某个过程时,只需要添加参数:
例:我们想执行 package 时,跳过 tag 过程,那么就需要 mvn package -DskipDockerTag。