我们常见开源项目中使用的Docker Maven插件是com.spotify:docker-maven-plugin。可用版本信息见Github

通过其介绍可知该插件已经不再推荐使用,取而代之的是com.spotify:dockerfile-maven-pluginMaven中央仓库Github地址

使用该插件可以在mvn命令中直接构建出Docker镜像和完成推送等。

dockerfile-maven-plugin要求用户必须提供Dockerfile用于构建镜像,从而将Docker镜像的构建依据统一到Dockerfile上,这与过时的docker-maven-plugin是不同的。

该插件的开源主页提供了丰富的参考资料:

使用该插件时,有一些注意事项

  1. 该插件依赖一台装有Docker daemon的Host完成镜像的构建
  2. 由于该插件需要访问Docker Host,因此要求Docker Host打开TCP管理端口,并允许访问
  3. 使用该插件的机器需要配置DOCKER_HOST选项,指向Docker Host对应端口
  4. 该插件构建和发布镜像依赖于镜像仓库,需要用户提供镜像仓库的登录信息,支持POM设置和Settings设置

Docker Host开启TCP管理端口

vim /usr/lib/systemd/system/docker.service

找到ExecStart=所在的那一行,在之后添加:

-H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375

重新加载并重启Docker,确认端口2375是否启用:

systemctl daemon-reload
systemctl restart docker
netstat -an | grep 2375

注意

  1. 这种方法不使用TLS
  2. 还要根据Linux发行版的具体防火墙机制,开发上述管理端口供外部可靠主机访问

客户端配置相关参数

Windows下

set DOCKER_HOST=tcp://x.x.x.x:2375

使用TLS时,更全面的参数设置,比如:

SET DOCKER_TLS_VERIFY=1
SET DOCKER_HOST=tcp://192.168.0.100:2376
SET DOCKER_CERT_PATH=C:\Users\kevin\.docker\machine\machines\remote-docker-host
SET DOCKER_MACHINE_NAME=remote-docker-host

请参考:

https://www.kevinkuszyk.com/2016/11/28/connect-your-docker-client-to-a-remote-docker-host/

POM方式配置Registry认证

构建镜像免不了获取基础镜像,需要获得指定Registry的访问权限。

可以将登录信息放在POM中实现认证

<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>${version}</version>
<configuration>
<username>repoUserName</username>
<password>repoPassword</password>
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>

与认证相关的是其中的usernamepassword元素,

repository是目标Docker Registry,是获取基础镜像,上传镜像产品的地方。

Settings方式配置Registry认证

该方法将认证信息存放在Maven的Settings文件中:

<servers>
<server>
<id>docker-repo.example.com:8080</id>
<username>me</username>
<password>mypassword</password>
</server>
</servers>

然后在POM的插件配置中,如下配置:

<configuration>
<repository>docker-repo.example.com:8080/organization/image</repository>
<tag>latest</tag>
<useMavenSettingsForAuth>true</useMavenSettingsForAuth>
</configuration>

注意useMavenSettingsForAuth元素说明认证信息从Settings获取,要求repository对应的Registry必须在Settings中有认证配置。

命令行指定认证信息

这种方法不在POM和Settings中保存认证信息,而是在构建的mvn命令中动态输入Registry的用户名和密码 :

<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>${version}</version>
<configuration>
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>

构建命令:

mvn GOAL -Ddockerfile.username=... -Ddockerfile.password=...

插件配置

先看一个基本的使用样例:

<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>${dockerfile-maven-version}</version>
<executions>
<execution>
<id>default</id>
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
<configuration>
<repository>spotify/foobar</repository>
<tag>${project.version}</tag>
<dockerfile>Dockerfile</dockerfile>
<contextDirectory>${project.basedir}</contextDirectory>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
  1. execution指定了该插件buildpush两个目标使用默认绑定,默认的,buildtag目标绑定到package阶段,push目标绑定到deploy阶段,这里不涉及tag目标。
  2. tag元素指定镜像的tag,这里使用Maven模块的版本号;
  3. target/${project.build.finalName}.jar为项目构建生成的JAR包路径
  4. 可以使用dockerfile元素指定Dockerfile的位置,上例中为和POM在同级目录;使用contextDirectory元素指定Docker构建上下文目录,上例中是该Maven项目的根目录。
  5. buildArgs元素指定了传递给Dockerfile的参数,比如上例中的JAR_FILE,相应的,Dockerfile中就可以使用该参数:
# ...
ARG JAR_FILE COPY ${JAR_FILE} /var/app.jar
#...

注意到我们在Dockerfile中只需声明JAR_FILE而不用手动赋值,即可在后面的构建指令中使用。

跳过插件目标

如果要临时跳过所有的Dockerfile相关的目标,执行如下Maven命令:

mvn clean install -Ddockerfile.skip

如果只是想跳过某一个goal,执行如下Maven命令:

mvn clean package -Ddockerfile.build.skip

mvn clean package -Ddockerfile.tag.skip

mvn clean deploy -Ddockerfile.push.skip

一些可以参考的资源:

https://blog.csdn.net/taiyangdao/article/details/79817787#commentsedit

https://www.callicoder.com/spring-boot-docker-example/

https://spring.io/guides/gs/spring-boot-docker/

最新文章

  1. Cesium原理篇:Property
  2. MongoDb学习1
  3. UVM中的class--2
  4. 面试题收集——Java基础部分(一)
  5. Mybatis中实体类中的字段跟对应表的字段不一致时解决办法
  6. 关于CSS的一些总结
  7. Win内存分配函数(GlobalAlloc/HeapAlloc/LocalAlloc/VirtualAlloc)
  8. 进阶-JMS 知识梳理
  9. Android-引导用户指纹录入
  10. class面向对象-1
  11. 使用jsonp请求本地json文件
  12. 【Android】Android设计准则
  13. 关于C#泛型作用的简单说明
  14. golang使用graphviz
  15. [Java.web]JSTL 使用
  16. linux 命令route add default dev eth0和route add default gw eth0的区别?
  17. Linux进程间通信—消息队列
  18. linux下vi编辑文件
  19. 如何快速上手.net下单元测试工具NUnit?
  20. Enumeration 接口的使用

热门文章

  1. 太细了!阿里十年技术专家联合打造“最新”Jetpack强化实战手册
  2. HDFS中NameNode工作机制
  3. 深入了解jvm-2Edition-虚拟机字节码执行引擎
  4. STP生成树的一些笔记
  5. MySQL-19-分布式架构MyCat
  6. 【笔记】scikit-learn中的Scaler(归一化)
  7. Spring源码浅析之bean实例的创建过程(一)
  8. SSH以及ROS远程登录设置保姆级教程
  9. WinForm嵌入Web网页的解决方案
  10. 【网络编程】TCPIP-8-套接字的多种选项