六使用Maven插件构建Docker镜像

使用Maven插件构建Docker镜像

我们知道,Maven是一个强大的项目管理与构建工具。如果可以使用Maven构建Docker镜像,那么我们的工作就能得到进一步的简化。

经过调研,以下几款Maven的Docker插件进入笔者视野,如表13-1所示。

插件名称官方地址
docker-maven-pluginhttps://github.com/spotify/docker-maven-plugin
docker-maven-pluginhttps://github.com/fabric8io/docker-maven-plugin
docker-maven-pluginhttps://github.com/bibryam/docker-maven-plugin

表13-1 Maven的Docker插件列表

笔者从各项目的功能性、文档易用性、更新频率、社区活跃度、Stars等几个纬度考虑,选用了第一款。这是一款由Spotify公司开发的Maven插件。

下面我们来详细探讨如何使用Maven插件构建Docker镜像。

快速入门

以项目microservice-discovery-eureka 为例。

(1) 在pom.xml中添加Maven的Docker插件。

<plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>0.4.13</version><configuration><imageName>itmuch/microservice-discovery-eureka:0.0.1</imageName><baseImage>java</baseImage><entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint><resources><resource><targetPath>/</targetPath><directory>${project.build.directory}</directory><include>${project.build.finalName}.jar</include></resource></resources></configuration>
</plugin>

简要说明一下插件的配置:

① imageName:用于指定镜像名称,其中itmuch是仓库名称,microservice-discovery-eureka是镜像名称,0.0.1是标签名称。

② baseImage:用于指定基础镜像,类似于Dockerfile中的FROM指令。

③ entrypoint:类似于Dockerfile的ENTRYPOINT指令。

④ resources.resource.directory:用于指定需要复制的根目录,${project.build.directory}表示target目录。

⑤ resources.resource.include:用于指定需要复制的文件。${project.build.finalName}.jar指的是打包后的jar包文件。

(2) 执行以下命令,构建Docker镜像。

mvn clean package docker:build

我们会发现终端输出类似于如下的内容:

[INFO] Building image itmuch/microservice-discovery-eureka:0.0.1
Step 1 : FROM java---> 861e95c114d6
Step 2 : ADD /microservice-discovery-eureka-0.0.1-SNAPSHOT.jar //---> 035a03f5b389
Removing intermediate container 2b0e70056f1d
Step 3 : ENTRYPOINT java -jar /microservice-discovery-eureka-0.0.1-SNAPSHOT.jar---> Running in a0149704b949---> eb96ca1402aa
Removing intermediate container a0149704b949
Successfully built eb96ca1402aa

由以上日志可知,我们已成功构建了一个Docker镜像。

(3)执行 docker images 命令,即可查看刚刚构建的镜像。

REPOSITORY                             TAG        IMAGE ID          CREATED             SIZE
itmuch/microservice-discovery-eureka   0.0.1      eb96ca1402aa      39 seconds ago      685 MB

(4) 启动镜像

docker run -d -p 8761:8761 itmuch/microservice-discovery-eureka:0.0.1

我们会发现该Docker镜像会很快地启动

(5) 访问测试

访问http://Docker宿主机IP:8761 ,能够看到Eureka Server的首页。

插件读取Dockerfile进行构建

之前的示例,我们直接在pom.xml中设置了一些构建的参数。很多场景下,我们希望使用Dockerfile更精确、有可读性地构建镜像。

(1) 首先我们在/microservice-discovery-eureka/src/main/docker 目录下,新建一个Dockerfile文件,例如:

FROM java:8
VOLUME /tmp
ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 9000
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

(2) 修改pom.xml

<plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>0.4.13</version><configuration><imageName>itmuch/microservice-discovery-eureka:0.0.2</imageName><dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory><resources><resource><targetPath>/</targetPath><directory>${project.build.directory}</directory><include>${project.build.finalName}.jar</include></resource></resources></configuration>
</plugin>

可以看到,我们不再指定baseImage和entrypoint,而是使用dockerDirectory指定Dockerfile所在的路径。这样,我们就可以使用Dockerfile构建Docker镜像了。

将插件绑定在某个phase执行

很多场景下,我们有这样的需求,执行例如mvn clean package 时,插件就自动为我们构建Docker镜像。要想实现这点,我们只需将插件的goal绑定在某个phase即可。

phase和goal可以这样理解:maven命令格式是:mvn phase:goal ,例如mvn package docker:build 。那么,package和docker都是phase,build则是goal 。示例:

<plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>0.4.13</version><executions><execution><id>build-image</id><phase>package</phase><goals><goal>build</goal></goals></execution></executions><configuration><imageName>itmuch/microservice-discovery-eureka:0.0.3</imageName><baseImage>java</baseImage><entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint><resources><resource><targetPath>/</targetPath><directory>${project.build.directory}</directory><include>${project.build.finalName}.jar</include></resource></resources></configuration>
</plugin>

由配置可知,我们只需添加如下配置:

<executions><execution><id>build-image</id><phase>package</phase><goals><goal>build</goal></goals></execution>
</executions>

就可将插件绑定在package这个phase上。也就是说,用户只需执行mvn package ,就会自动执行mvn docker:build 。当然,读者也可按照需求,将插件绑定到其他的phase。

推送镜像

前文我们使用docker push 命令实现了镜像的推送,我们也可使用Maven插件推送镜像。我们不妨使用Maven插件推送一个Docker镜像到Docker Hub。

(1) 修改Maven的全局配置文件setttings.xml,在其中添加以下内容,配置Docker Hub的用户信息。

<server><id>docker-hub</id><username>你的DockerHub用户名</username><password>你的DockerHub密码</password><configuration><email>你的DockerHub邮箱</email></configuration>
</server>

(2) 修改pom.xml,示例:

<plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>0.4.13</version><configuration><imageName>itmuch/microservice-discovery-eureka:0.0.4</imageName><baseImage>java</baseImage><entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint><resources><resource><targetPath>/</targetPath><directory>${project.build.directory}</directory><include>${project.build.finalName}.jar</include></resource></resources><!-- 与maven配置文件settings.xml中配置的server.id一致,用于推送镜像 --><serverId>docker-hub</serverId></configuration>
</plugin>

如上,添加serverId段落,并引用settings.xml中的server的id即可。

(3) 执行以下命令,添加pushImage的标识,表示推送镜像。

mvn clean package docker:build  -DpushImage

经过一段时间的等待,我们会发现Docker镜像已经被push到Docker Hub了。同理,我们也可推送镜像到私有仓库,只需要将imageName指定成类似于如下的形式即可:

<imageName>localhost:5000/itmuch/microservice-discovery-eureka:0.0.4</imageName>

TIPS

(1) 以上示例中,我们是通过imageName指定镜像名称和标签的,例如:

<imageName>itmuch/microservice-discovery-eureka:0.0.4</imageName>

我们也可借助imageTags元素更为灵活地指定镜像名称和标签,例如:

<configuration><imageName>itmuch/microservice-discovery-eureka</imageName><imageTags><imageTag>0.0.5</imageTag><imageTag>latest</imageTag></imageTags>...
<configuration>

这样就可为同一个镜像指定两个标签。

(2) 我们也可在执行构建命令时,使用dockerImageTags参数指定标签名称,例如:

mvn clean package docker:build -DpushImageTags -DdockerImageTags=latest -DdockerImageTags=another-tag

(3) 如需重复构建相同标签名称的镜像,可将forceTags设为true,这样就会覆盖构建相同标签的镜像。

<configuration><!-- optionally overwrite tags every time image is built with docker:build --><forceTags>true</forceTags>
<configuration>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/642017.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言学习(3)—— 函数

C语言不支持函数重载 一、函数的使用方法 1. 直接使用 &#xff08;1&#xff09;定义的函数在main函数 之上 #include<stdio.h> int sum(int num1, int num2){int res 0;res num1 num2;return res; }int main(){int res sum(2, 3);printf("%d", res…

大数据学习之Flink、搞懂Flink的恢复策略

第一章、Flink的容错机制 第二章、Flink核心组件和工作原理 第三章、Flink的恢复策略 第四章、Flink容错机制的注意事项 第五章、Flink的容错机制与其他框架的容错机制相比较 目录 第三章、Flink的恢复策略 Ⅰ、恢复策略 1. Checkpoint&#xff1a; 2. Savepoint&#…

Sentinel降级操作

1.通过对feign调用的降级 如果访问失败&#xff0c;则返回另外的信息 正常的feign调用 FeignClient(value "gulimall-seckill",fallback SeckillFeignServiceFallback.class) public interface SeckillFeignService {/*** 写给商品服务的接口&#xff0c;查询秒杀…

2024茶饮品牌如何出圈,媒介盒子分析

随着新式茶饮的消费场景更加多元化&#xff0c;品类不断拓宽&#xff0c;消费者对新式茶饮的热情也是只增不减。居民可支配收入水平不断上升&#xff0c;居民消费升级为新式茶饮的发展也提供了良好基础&#xff0c;今天媒介盒子就来和大家聊聊&#xff1a;2024茶饮品牌如何出圈…

win10系统 pdf 文件无法正常预览

网上也看了不少办法&#xff0c;修改注册表什么的&#xff0c;太麻烦了&#xff0c;尝试了一下下载Adobe Acrobat Reader&#xff0c;安装后就可以成功预览显示啦&#xff01;对&#xff0c;就是这么简单&#xff01;Adobe Acrobat Reader下载链接&#xff1a;link

随机森林中每个树模型分裂时的特征选取方式

随机森林中每个树模型分裂时的特征选取方式 随机森林中每个树模型的每次分裂都是基于随机选取的特征子集进行分裂的。 具体来说&#xff0c;对于每个决策树&#xff0c;在每个节点的分裂过程中&#xff0c;随机森林算法会从原始特征集合中随机选择一个特征子集&#xff0c;然…

vulhub之Zabbix篇

CVE-2016-10134--SQL注入 一、漏洞介绍 zabbix是一款服务器监控软件&#xff0c;其由server、agent、web等模块组成&#xff0c;其中web模块由PHP编写&#xff0c;用来显示数据库中的结果。 漏洞环境 在vulhub靶场进行复现&#xff0c;启动zabbix 3.0.3。 二、复现步骤 1…

[代码随想录2]51单片机1T/12T到底怎么选?

为什么说51单片机怎么选&#xff1f; 时至今日&#xff0c;44年来51单片机自强不息&#xff0c;怎么描述它&#xff0c;堪称控制芯片中的王者&#xff01;&#xff01;&#xff01; 假设你21岁大学毕业进入社会&#xff0c;交社保交到今天恭喜你成功退休了214465 传统即标准5…

搭建一个简单的Spring Demo

要学习Spring 源码&#xff0c;一个是从Spring GitHub 上去down源码&#xff0c;然后倒入IDEA编译&#xff0c;但这种方法费时费力&#xff0c;如果你不需要对Spring 源码进行修改后&#xff0c;再编译的话&#xff0c;直接搭建一个Spring Demo 的Maven项目&#xff0c;引入Spr…

代理设计模式JDK动态代理CGLIB动态代理原理

代理设计模式 代理模式&#xff08;Proxy&#xff09;&#xff0c;为其它对象提供一种代理以控制对这个对象的访问。如下图 从上面的类图可以看出&#xff0c;通过代理模式&#xff0c;客户端访问接口时的实例实际上是Proxy对象&#xff0c;Proxy对象持有RealSubject的引用&am…

使用DockerFile构建镜像与镜像上传

目录 前言&#xff1a;为什么要使用Dockerfile &#xff1f; DockerFile构建镜像 1、构建基础对象 2、Dockerfile文件结构 3、构建Dockerfile文件镜像 二、镜像上传&#xff08;阿里云&#xff09; 前言&#xff1a;为什么要使用Dockerfile &#xff1f; 首先Dockerfile …

IOS-生命周期-Swift

目录 App生命周期应用状态未运行——Not running未激活——Inactive激活——Active后台——Backgroud挂起——Suspended 关系图生命周期方法相关方法注意在其他地方监听 ViewController生命周期UIView生命周期 App生命周期 应用状态 App主要有五种状态&#xff0c;分别是&…

Axure RP 9 动态面板

目录 轮播图绘制 多种方式登录 前言: 轮播图绘制、多种方式登录界面绘制 轮播图绘制 首先绘制一个动态面板 在概要区域选中动态面板进入State1面板中插入图片绘制 双击图片绘制插入本地图片&#xff0c;右键State1重复状态并更改图片 点击交互面板新建交互将需要添加…

RuoYi-Cloud本地部署--详细教程

文章目录 1、gitee项目地址2、RuoYi-Cloud架构3、本地部署3.1 下载项目3.2 idea打开项目3.3 启动nacos3.4 若依数据库准备3.5 启动redis3.6 修改nacos中的各个模块的配置文件3.7 启动ruoyi前端项目3.8 启动各个微服务模块 4、启动成功 1、gitee项目地址 https://gitee.com/y_p…

http网络编程——在ue5中实现文件传输功能

http网络编程在ue5中实现 需求&#xff1a;在unreal中实现下载功能&#xff0c;输入相关url网址&#xff0c;本地文件夹存入相应文件。 一、代码示例 1.Build.cs需要新增Http模块&#xff0c;样例如下。 PublicDependencyModuleNames.AddRange(new string[] { "Core&q…

Whatsapp 相关

Whatsapp 相关 本篇文章主要记录下whatsapp 的一些文件信息的存储路径. 1: 应用包名 whatsapp的包名如下: com.whatsapp 2: 注册信息 whatsapp的注册信息存储路径如下: /data/data/com.whatsapp/shared_prefs/registration.RegisterPhone.xml内容如下: <?xml versio…

Android:RecyclerView自由拖动item

原生就自带有可拖动item的工具&#xff1a;ItemTouchHelper 看下效果&#xff1a; 可拖动RecyclerView预览效果 接下来我们看如何使用。 1、自定义ItemTouchHelper的callback&#xff0c;用来限制是否可以拖动&#xff0c;以及拖动之后的位置更新&#xff1a; 其中判断条件中…

python的__doc__

直接问GPT的回答如下&#xff0c;但是提供的例子不够好。 __doc__ 是 Python 中用于保存对象&#xff08;模块、类、函数等&#xff09;文档字符串的特殊属性。 文档字符串&#xff08;docstring&#xff09;是编写在代码中用于文档自述的字符串。它通常用于提供关于代码目的…

python常见函数-笔记

lambda函数用法 匿名函数lambda&#xff1a;是指一类无需定义标识符&#xff08;函数名&#xff09;的函数或子程序。 所谓匿名函数&#xff0c;通俗地说就是没有名字的函数&#xff0c;lambda函数没有名字&#xff0c;是一种简单的、在同一行中定义函数的方法。 lambda函数一…

锂电池SOC估计 | PatchTST时间序列模型锂电池SOC估计

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 锂电池SOC估计 | PatchTST时间序列模型锂电池SOC估计 采用新型PatchTST时间序列模型预测锂电池SOC&#xff0c;送锂电池数据集 可替换数据集&#xff0c;实现负荷预测、流量预测、降雨量预测、空气质量预测等其他多种…