准备工作
操作系统版本
[root@node02 ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
docker版本
[root@node02 ~]# docker -v
Docker version 18.06.3-ce, build d7080c1
接上一篇: 【Docker之使用maven插件【配置方式】构建并推送镜像到私有仓库】 ,这次我们通过 maven 插件和Dockerfile混合方式来生成镜像并推送到私有仓库
本文内容和上一篇只有以下几个地方不一样,前提是你的docker私有仓库搭建好了,并且开启了api服务,可以参考: 【Docker之用docker-compose安装registry和docker-registry-web私有仓库和仓库前端】
-
在自己项目里新建一个 Dockerfile文件,可以放在自定义的目录里:
-
编辑maven pom文件,我们使用 docker-maven-plugin,和上一篇区别在添加了 dockerDirectory 标签指定了Dockerfile的路径,并且配置相关的只保留 resources 标签,私有仓库相关的不变;
<plugin>
<!--docker-maven-plugin start-->
<groupId>com.spotify</groupId>
<!--文档参考 https://github.com/spotify/docker-maven-plugin -->
<artifactId>docker-maven-plugin</artifactId>
<version>1.1.0</version>
<configuration>
<!--============================================仓库相关配置================================================-->
<!--私有仓库地址-->
<registryUrl>192.168.126.99:5000</registryUrl>
<!--
docker api地址
构建镜像是通过调用在 http://192.168.126.99:2375 上的api构建image,以便后续推送到registryUrl上;
如果本地开启了docker api,这个地方也可以填本地的docker api地址
-->
<dockerHost>http://192.168.126.99:2375</dockerHost>
<!--是否推送镜像-->
<pushImage>true</pushImage>
<!--推送后是否覆盖已存在的标签镜像-->
<forceTags>true</forceTags>
<!--=============================================构建相关配置===============================================-->
<!--镜像名称-->
<imageName>192.168.126.99:5000/${project.artifactId}:${project.version}</imageName>
<!--
To use a Dockerfile, you must specify the dockerDirectory element.
If specified, the baseImage, maintainer, cmd and entryPoint elements will be ignored.
The contents of the dockerDirectory will be copied into ${project.build.directory}/docker.
Use the resources element to copy additional files, such as the service's jar file.
-->
<dockerDirectory>${project.basedir}/docker_file</dockerDirectory>
<!--插件会将需要的资源拷贝到 docker目录下,供Dockerfile里构建镜像使用-->
<resources>
<resource>
<targetPath>/${app.dir}</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
<include>classes/application.yaml</include>
</resource>
</resources>
</configuration>
<!--docker-maven-plugin end-->
</plugin>
Dockerfile 内容:
FROM openjdk:8-jre
COPY /app/tailf-web-1.2.1-SNAPSHOT.jar /app/tailf-web-1.2.1-SNAPSHOT.jar
COPY /app/classes/application.yaml /app/log/
WORKDIR /app
CMD ["java", "-jar", "/app/tailf-web-1.2.1-SNAPSHOT.jar"]
原理
docker-maven-plugin插件在配置dockerDirectory后会忽略掉pom里的baseImage, maintainer, cmd and entryPoint配置,我们可以使用 resources 标签准备构建镜像的文件;
其大致流程:
1、resources标签指定的资源会被复制到编译路径下的docker目录里
2、根据Dockerfile定义,调用docker api即 dockerHost 标签配置的服务器构建镜像(可以设置成本地,如果本地有docker服务并开启了docker api)
3、docker api所在的服务器构建镜像完毕,将镜像推送到私有仓库
构建推送:clean - build - docker:build
日志:
分析
Dockerfile方式比pom里配置的方式相比,个人觉得更喜欢Dockerfile方式
文档
1、docker-maven-plugin文档
【spotify/docker-maven-plugin】 https://github.com/spotify/docker-maven-plugin
2、代码上传到了 【码云】 ,可点击查看
over~