maven中使用docker插件

在maven中使用docker插件完成docker镜像的生成与上传

Posted by yishuifengxiao on 2019-05-06

在 maven 中使用 docker 插件完成 docker 镜像的生成与上传到 docker 仓库


一 maven 的生命周期

阶段 处理 描述
验证 validate 验证项目 验证项目是否正确且所有必须信息是可用的
编译 compile 执行编译 源代码编译在此阶段完成
测试 Test 测试 使用适当的单元测试框架(例如 JUnit)运行测试。
包装 package 打包 创建 JAR/WAR 包如在 pom.xml 中定义提及的包
检查 verify 检查 对集成测试的结果进行检查,以保证质量达标
安装 install 安装 安装打包的项目到本地仓库,以供其他项目使用
部署 deploy 部署 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程

为了完成 default 生命周期,这些阶段(包括其他未在上面罗列的生命周期阶段)将被按顺序地执行。

当一个阶段通过 Maven 命令调用时,例如 mvn compile,只有该阶段之前以及包括该阶段在内的所有阶段会被执行。不同的 maven 目标将根据打包的类型(JAR / WAR / EAR),被绑定到不同的 Maven 生命周期阶段。

命令行调用

在开发环境中,使用下面的命令去构建、安装工程到本地仓库

mvn install

这个命令在执行 install 阶段前,按顺序执行了 default 生命周期的阶段 (validate,compile,package,等等),我们只需要调用最后一个阶段,如这里是 install。

在构建环境中,使用下面的调用来纯净地构建和部署项目到共享仓库中

mvn clean deploy

这行命令也可以用于多模块的情况下,即包含多个子项目的项目,Maven 会在每一个子项目执行 clean 命令,然后再执行 deploy 命令。

二 使用 dockerfile-maven-plugin 插件

2.1 增加 pom 配置

首先在 maven 的 pom 文件中增加以下插件配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>${com.spotify.version}</version>
<executions>
<execution>
<id>default</id>
<phase>package</phase>
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- 上下文路径配置,此处设置为项目根路径 -->
<contextDirectory>${project.basedir}</contextDirectory>
<!-- docker.image.prefix一般配置的是private registry或者自己的dockerhub仓库地址 -->
<repository>${docker.image.prefix}/${project.build.finalName}</repository>
<!-- 配置的构建的Docker image的tag -->
<tag>test</tag>
<useMavenSettingsForAuth>true</useMavenSettingsForAuth>
<force>true</force>
<buildArgs>
<!-- 配置了一个参数JAR_FILE,在根据Dockerfile构建image会用到,下文会看到 -->
<JAR_FILE>target/${project.build.finalName}.${project.packaging}</JAR_FILE>
</buildArgs>
</configuration>
</plugin>

2.2 编写 dockerfile 文件

在 pom.xml 文件的同级目录下增加一个名为Dockerfile的文件。

文件的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 基础镜像:java:8-alpine
FROM java:8-alpine
# 挂载目录,默认的安装jar包位置:/tmp
VOLUME /tmp
# 上一步在pom.xml指定的JAR_FILE参数
ARG JAR_FILE
# 将上一步的jar包copy到镜像中的根目录,并重命名为app.jar
COPY ${JAR_FILE} app.jar
# 需要暴露的端口
EXPOSE 8091

# 启动jar包
ENTRYPOINT ["java","-Duser.timezone=GMT+08","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

2.3 执行打包命令

需要打包时执行以下 maven 命令:

1
mvn clean deploy -P release

2.4 查看结果

此时,可以登录 docker 镜像仓库看到刚才推送的 docker 镜像。

三 使用 docker-maven-plugin 插件

3.1 配置用户名和密码

在 ${MAVEN_HOME}/conf/settings.xml 文件中的 servers 节点下增加以下配置

1
2
3
4
5
6
7
8
9
<server>
<!--此id很重要,在maven插件中会使用到-->
<id>registry.cn-hangzhou.aliyuncs.com</id>
<username>用户名</username>
<password>密码</password>
<configuration>
<email>邮箱</email>
</configuration>
</server>

3.2 增加 pom.xml 配置

在项目的 pom.xml 文件中增加以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<!-- docker的maven插件,官网:https://github.com/spotify/docker-maven-plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>${docker-maven-plugin.version}</version>
<!-- <executions>
执行 mvn package 时 自动 执行 mvn docker:build
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions> -->
<configuration>
<!--推送到私有仓库 -->
<imageName>registry.cn-hangzhou.aliyuncs.com/yishuifengxiao/${project.build.finalName}:test</imageName>
<baseImage>java:8-alpine</baseImage>
<!-- 指定Dockerfile所在的路径 -->
<!-- <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory> -->
<entryPoint>["java","-Duser.timezone=GMT+08","-Djava.security.egd=file:/dev/./urandom","-jar","/${project.build.finalName}.${project.packaging}"]</entryPoint>
<skipDockerBuild>false</skipDockerBuild>
<registryUrl>registry.cn-hangzhou.aliyuncs.com</registryUrl>
<!-- 镜像版本,可以多个 -->
<!-- <imageTags> <imageTag>${project.version}</imageTag> <imageTag>latest</imageTag>
</imageTags> -->
<!--true 表示install阶段也上传,否则只有deploy阶段上传 -->
<pushImage>true</pushImage>
<!-- 强制docker在每次新的构建上覆盖镜像tags,可配置foreceTags -->
<forceTags>true</forceTags>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.${project.packaging}</include>
</resource>
</resources>
<serverId>docker_yishui</serverId>
</configuration>
</plugin>

3.3 执行打包命令

按照上面的配置之后,可以使用如下命令生成一个镜像

1
mvn clean package docker:build

将生成的镜像推送到镜像注册中心,通过 pushImage 标签

1
mvn clean package -Dmaven.test.skip=true docker:build -DpushImage

如果推送制定 tags 的镜像,可使用 pushImageTag 标签

1
mvn clean package -Dmaven.test.skip=true docker:build -DpushImageTag

3.4 查看结果

此时,可以登录 docker 镜像仓库看到刚才推送的 docker 镜像。