使用maven插件构建docker镜像

为什么要用插件

主要还是自动化的考虑,如果额外使用Dockerfile进行镜像生成,可能会需要自己手动指定jar/war位置,并且打包和生成镜像间不同步,带来很多琐碎的工作。

插件选择

使用比较多的是spotify的插件:https://github.com/spotify/docker-maven-plugin
和 https://github.com/spotify/dockerfile-maven。
但这里我选择另一款插件:https://github.com/fabric8io/docker-maven-plugin。
因为他文档比较详细,在使用上也比较方便。
文档地址:https://dmp.fabric8.io/

示例

这里使用一个spring boot项目,只有一个最简单的HelloController,如下:

@RestController
public class HelloController {@GetMapping("/")public String hello() {return "hello";}
}

pom.xml改动如下:

<plugin><groupId>io.fabric8</groupId><artifactId>docker-maven-plugin</artifactId><version>0.23.0</version><configuration><dockerHost>tcp://192.168.99.100:2376</dockerHost><certPath>C:\Users\fairjm\.docker\machine\machines\default</certPath><images><image><name>${project.name}:${project.version}</name><build><from>openjdk:8-jre</from><args><JAR_FILE>${project.name}-${project.version}.jar</JAR_FILE></args><assembly><descriptorRef>artifact</descriptorRef></assembly><entryPoint>["java"]</entryPoint><cmd>["-jar","maven/${project.name}-${project.version}.jar"]</cmd></build><run><ports><port>8888:8080</port></ports></run></image></images></configuration>
</plugin>

这里使用了在xml里写操作而不是使用Dockerfile的方式,个人感觉这种方式更加简单一点,不需要额外再维护一份文件,和Dockerfile相比使用的语法(注意entrypoint和cmd)也类似。

接下来介绍一下configuration配置。
dockerHostcertPath是连接docker使用,毕竟插件本身不包含docker和对应功能只是调用docker提供的API。
这两个值在docker toolbox上可以通过docker-machine env获得。

$ docker-machine env
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="C:\Users\fairjm\.docker\machine\machines\default"
export DOCKER_MACHINE_NAME="default"
export COMPOSE_CONVERT_WINDOWS_PATHS="true"
# Run this command to configure your shell:
# eval $("D:\Docker Toolbox\docker-machine.exe" env)

image的build指定了构建相关的设置:

  • name指定image名,这里使用了项目名,tag使用项目版本;
  • from指定基于的image,和Dockerfile的FROM一致;
  • args和ARG一致(在这个例子中没有实际意义);
  • assembly用来定义哪些文件进入镜像中,使用了插件已经定义好的行为,spring-boot生成的是fat jar不需要拷贝依赖所以选择了artifact。这个的配置比较丰富,可以查看文档获取更多的信息。
  • entryPoint和cmd也对应同样的Dockerfile命令。

接着通过mvn clean package docker:build执行打包和build

[INFO] --- maven-jar-plugin:2.6:jar (default-jar) @ docker-test ---
[INFO] Building jar: D:\sts_workspace\docker-test\target\docker-test-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:1.5.9.RELEASE:repackage (default) @ docker-test ---
[INFO]
[INFO] --- docker-maven-plugin:0.23.0:build (default-cli) @ docker-test ---
[INFO] Copying files to D:\sts_workspace\docker-test\target\docker\docker-test\0.0.1-SNAPSHOT\build\maven
[INFO] Building tar: D:\sts_workspace\docker-test\target\docker\docker-test\0.0.1-SNAPSHOT\tmp\docker-build.tar
[INFO] DOCKER> [docker-test:0.0.1-SNAPSHOT]: Created docker-build.tar in 1 second
[INFO] DOCKER> [docker-test:0.0.1-SNAPSHOT]: Built image sha256:303c3
[INFO] DOCKER> [docker-test:0.0.1-SNAPSHOT]: Removed old image sha256:ea8a7
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

完成打包,在对应连接的docker上也会出现这个镜像:

$ docker image ls
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
docker-test                       0.0.1-SNAPSHOT      303c39c7d253        13 seconds ago      552MB

run指定了运行参数 这里将host的8888和容器的8080绑定,可以使用mvn docker:start启动,访问8888端口即可连接到服务器。
与其配对的是mvn docker:stop,可以停止并移除启动的容器。

示例2

上述使用xml的配置方式,这里再简单描述一下使用Dockerfile的配置方式。
在进行一些操作的时候,可以发现使用xml会有些问题,比如指令的执行顺序。
该插件xml的执行顺序和命令的定义顺序不一定一致,可能会带来一些问题,比如将<user>放于<runCmds>前但还是<runCmds>先触发,一些需要root权限的命令就会失败。
比如这个issus(但不确定是feature还是bug,感觉是feature):https://github.com/fabric8io/docker-maven-plugin/issues/913

这时候就需要直接使用Dockerfile来进行配置。
这里取一个实际的打成war的工程。
插件配置如下:

<images><image><name>${project.name}:${project.version}</name><build><assembly><descriptorRef>rootWar</descriptorRef></assembly><dockerFile>Dockerfile</dockerFile></build><run><ports><port>8888:8080</port></ports></run></image>
</images>

这里更改了descriptorRef,换成rootWar,这会将target下的项目war拷贝到maven\下并且取名为ROOT.war
Dockerfile默认放置的位置是src/main/docker,我们在这里建对应的文件:

FROM jetty
USER root
ENV JAVA_OPTIONS=-Xmx1g
RUN mkdir -p /root/xxx && touch /root/xxx/yyy && echo zz > /root/xxx/yyy
COPY maven/ /var/lib/jetty/webapps

基本和上面的配置类似,base image改为了jetty,查看jetty的Dockerfile可以发现他使用了一个新用户jetty,使用这个用户无法在root下建立目录,并且由于项目本身之前使用sudo执行的,所以为了能正常运行选择使用root用户。
最后一步将ROOT.war拷贝到jetty的webapps目录下。

关于maven/这个目录,在打包后,会在target下生成target\docker\项目名\0.0.1-SNAPSHOT\build,对应的Dockerfilemaven\就在这个目录下,实际执行的不是src/main/docker/Dockerfile,而是拷贝到上述目录下的Dockerfile,此外使用xml的方式也是在这个位置生成了一份Dockerfile(USER 总是被放置于最后...)。

更多

本文简要说明了使用fabric8的docker maven插件进行构建运行相关的操作,该插件还有其他的功能可以通过上面的文档获取帮助。

源码下载(示例1)

https://github.com/fairjm/spring-boot-docker

转载于:https://www.cnblogs.com/fairjm/p/docker_maven_springboot.html

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

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

相关文章

windows下如何安装pip以及如何查看pip是否已经安装成功?

最近刚学习python&#xff0c;发现很多关于安装以及查看pip是否安装成的例子都比较老&#xff0c;不太适合于现在&#xff08;python 3.6 &#xff09;因此&#xff0c;下一个入门级别的教程。 0&#xff1a;首先如何安装python我就不做介绍了。 1&#xff1a;如果安装的是pyth…

检查用户显示器的分辨率

检查用户显示器的分辨率 转载于:https://www.cnblogs.com/Renyi-Fan/p/8088012.html

android 字体 dpi,详解Android开发中常用的 DPI / DP / SP

Android的碎片化已经被喷了好多年&#xff0c;随着国内手机厂商的崛起&#xff0c;碎片化也越来越严重&#xff0c;根据OpenSignal的最新调查&#xff0c;2014年市面上有18796种不同的Android设备&#xff0c;作为开发者&#xff0c;一个无法回避的难题就是需要适配各种各样奇奇…

android studio闪退代码不报错_代码不报错,不代表真的没错

今天是生信星球陪你的第695天大神一句话&#xff0c;菜鸟跑半年。我不是大神&#xff0c;但我可以缩短你走弯路的半年~就像歌儿唱的那样&#xff0c;如果你不知道该往哪儿走&#xff0c;就留在这学点生信好不好~这里有豆豆和花花的学习历程&#xff0c;从新手到进阶&#xff0c…

Centos7操作系统部署指南

一、硬件环境&#xff1a; Dell R620 二、软件环境&#xff1a; Centos6.4 X86_64 KVM Windows7vnc 三、安装说明 操作系统更新之迅速&#xff0c;让作为新手的系统运维人员有点措手不及&#xff0c;相对于老手就胸有成竹。怎么讲&#xff1f;由于老手对技术方向把握的非常好&…

Eclipse插件中的SLF4J登录

一直都在使用Maven和纯Java库进行开发&#xff0c;我从没想过在开发Eclipse插件时发出一些日志语句可能会成为问题。 但是&#xff0c;在Eclipse开发人员的想象中&#xff0c;一切似乎总是在Eclipse环境中&#xff0c;而Eclipse宇宙之外则什么都没有。 如果您使用Google搜索上…

CSS(四)

css元素溢出 当子元素的尺寸超过父元素的尺寸时&#xff0c;需要设置父元素显示溢出的子元素的方式&#xff0c;设置的方法是通过overflow属性来设置。 overflow的设置项&#xff1a; 1、visible 默认值。内容不会被修剪&#xff0c;会呈现在元素框之外。2、hidden 内容会被修…

mysql排名

转载自思心思危http://www.cnblogs.com/zengguowang/p/5541431.html 一、sql1&#xff5b;不管数据相同与否&#xff0c;排名依次排序&#xff08;1,2,3,4,5,6,7.....&#xff09;&#xff5d; SELECTobj.user_id,   obj.score,  rownum : rownum 1 AS rownum FROM(SELECT…

python中变量名后的逗号_深入浅析python变量加逗号,的含义

逗号,用于生成一个长度为1的元组>>> (1)1>>> (1,)(1,)>>> 1,(1,)因此需要将长度为1的元组中元素提取出来可以用,简化赋值操作>>> a(1,)>>> ba>>> b(1,)>>> b,a>>> b1最后print打印变量加,实现连续打印…

广告的显示和关闭

app或游戏的主页显示广告页面&#xff0c;实现方式&#xff1a; public class MainActivity extends Activity implements View.OnClickListener{private Button btnShowAd;private RelativeLayout layoutAd;Overrideprotected void onCreate(Bundle savedInstanceState) {supe…

android签到功能模块,基于android的课堂签到系统.doc

基于android的课堂签到系统本科毕业论文(设计)题 目 基于Android的课堂签到系统学生姓名 XXX指导教师 XX学 院 信息科学与工程学院专业班级 计算机科学与技术0908班完成时间 2013年5月 摘 要在大学课堂中&#xff0c;签到问题一直困扰着老师和同学们。传统课堂签到的手段大多是…

Java EE 7社区调查结果!

在JSR 342下可以继续进行Java EE 7的工作。一切进展顺利&#xff0c;Java EE 7现在处于“初稿审查”阶段。 在11月初&#xff0c; Oracle发布了一个有关即将推出的Java EE 7功能的小型社区调查 。 昨天结果公布了。 超过1,100名开发人员参加了调查&#xff0c;并且几乎对每个问…

CSS(三)

CSS盒子模型 盒子模型解释 元素在页面中显示成一个方块&#xff0c;类似一个盒子&#xff0c;CSS盒子模型就是使用现实中盒子来做比喻&#xff0c;帮助我们设置元素对应的样式。盒子模型示意图如下&#xff1a; 把元素叫做盒子&#xff0c;设置对应的样式分别为&#xff1a;盒…

一道关于运行顺序题

function foo(){   getName function(){console.log(1)}   return this } foo.getName function(){console.log(2)} foo.prototype.getName function(){console.log(3)} var getName function(){console.log(4)} function getName(){console.log(5)} foo.getName()//2 …

android+小米文件管理器源码,小米开源文件管理器MiCodeFileExplorer-源码研究(2)-2个单实例工具类...

从本篇开始&#xff0c;讲解net.micode.fileexplorer.util工具包中的类。这个包下的类&#xff0c;功能也比较单一和独立。很多代码的思想和实现&#xff0c;可以用于JavaWeb和Android等多种环境中。一、单实例活动管理器ActivitiesManager一个单实例的活动管理器&#xff0c;从…

移动优先的响应式布局

前面的话 随着移动互联网的兴起&#xff0c;不同设备的分辨率相差较大&#xff0c;如果在不同的设置上显示同一个页面&#xff0c;则用户体验差。响应式网页设计是一种方法&#xff0c;使得一个网站能够兼容多个终端&#xff0c;而不用为每个终端制作特定的版本。它使得一个网站…

python中英文字符和中文字符存储长度不同_Django如何正确截取中英混合字符串及表单中限制中文字符中长度...

中文字符和英文字符所占的字节长度是不一样&#xff0c;一个是2个字节&#xff0c;一个是1个字节&#xff0c;这给我们用英文的web框架开发中文app带来了麻烦。比如Django自带过滤器truncatewords并不支持截取中文&#xff0c;另外模型中CharField中的max_length选项用于限制中…

使用RESTful客户端API进行GET / POST

互联网上有很多如何使用RESTful Client API的东西。 这些是基础。 但是&#xff0c;尽管该主题看起来微不足道&#xff0c;但仍然存在一些障碍&#xff0c;尤其是对于初学者而言。 在这篇文章中&#xff0c;我将尝试总结我的专业知识&#xff0c;以及我如何在实际项目中做到这…

南昌互联网行业协会筹办者祝真和华罡团队-2014年12月江西IDC排行榜

&#xfeff;&#xfeff;他出自军营&#xff0c;拥有一身正气。 他在南昌创业&#xff0c;立意卓越。 从站点開始、到微营销、到线上教育&#xff0c;全面开花。 他在朋友圈看到不对的内容&#xff0c;就会即时批评。 他对朋友&#xff0c;又是很的和蔼可亲。 他就是南昌华罡网…

Linux下查看某个进程的网络带宽占用情况

说明&#xff1a; 1、可能查看某个进程的带宽占用需要明确知道PID、进程名字、发送速度、接收速度。 2、很遗憾&#xff0c;在Linux原生的软件中没有这样的一款&#xff0c;只能额外装&#xff0c;最符合以上的情况就只有nethogs。 3、nethogs可以指定网卡&#xff0c;但是不能…