在 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 镜像。