使用Maven插件构建Spring Boot应用程序镜像
使用Maven插件构建Spring Boot应用程序的Docker镜像。
环境准备
1.Linux系统
2.安装JDK,Maven
3.安装Docker
应用实践
1.在应用程序根目录下添加Dockerfile文件

并在Dockerfile中编辑构建内容:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
2.在项目pom.xml中添加docker镜像构建插件dockerfile-maven-plugin
<build>
<plugins>
<!-- 使用Maven插件直接将应用打包为一个Docker镜像 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
显然,在插件dockerfile-maven-plugin中配置了2个参数:
<repository>:指定镜像仓库信息及镜像名称,如:springio/test-springboot<buildArgs>:设置构建参数,该参数可以直接在Dockerfile中使用(但是必须在Dockerfile使用ARG指令声明)
3.执行构建
在Spring Boot应用根目录下执行构建:
mvn install dockerfile:build
将会看到如下构建日志:
...
[INFO] Building Docker context /home/chench/workspace/java/test-springboot
[INFO]
[INFO] Image will be built as springio/test-springboot:latest
[INFO]
[INFO] Step 1/5 : FROM openjdk:8-jdk-alpine
[INFO]
[INFO] Pulling from library/openjdk
[INFO] Image ff3a5c916c92: Pulling fs layer
[INFO] Image 5de5f69f42d7: Pulling fs layer
[INFO] Image fd869c8b9b59: Pulling fs layer
[INFO] Image 5de5f69f42d7: Downloading
[INFO] Image 5de5f69f42d7: Verifying Checksum
[INFO] Image 5de5f69f42d7: Download complete
[INFO] Image ff3a5c916c92: Downloading
[INFO] Image fd869c8b9b59: Downloading
[INFO] Image ff3a5c916c92: Verifying Checksum
[INFO] Image ff3a5c916c92: Download complete
[INFO] Image ff3a5c916c92: Extracting
[INFO] Image ff3a5c916c92: Pull complete
[INFO] Image 5de5f69f42d7: Extracting
[INFO] Image 5de5f69f42d7: Pull complete
[INFO] Image fd869c8b9b59: Verifying Checksum
[INFO] Image fd869c8b9b59: Download complete
[INFO] Image fd869c8b9b59: Extracting
[INFO] Image fd869c8b9b59: Pull complete
[INFO] Digest: sha256:e82316151c501a2a0f73b3089da8dc867816470a464fcb191db9f88c2343ad53
[INFO] Status: Downloaded newer image for openjdk:8-jdk-alpine
[INFO] ---> 224765a6bdbe
[INFO] Step 2/5 : VOLUME /tmp
[INFO]
[INFO] ---> Running in 99fc0b2bbcf7
[INFO] Removing intermediate container 99fc0b2bbcf7
[INFO] ---> 74c89740c46e
[INFO] Step 3/5 : ARG JAR_FILE
[INFO]
[INFO] ---> Running in 54d9bf00c9c6
[INFO] Removing intermediate container 54d9bf00c9c6
[INFO] ---> 81d324efe92b
[INFO] Step 4/5 : COPY ${JAR_FILE} app.jar
[INFO]
[INFO] ---> f11354b41c33
[INFO] Step 5/5 : ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
[INFO]
[INFO] ---> Running in 74d40fc4f99c
[INFO] Removing intermediate container 74d40fc4f99c
[INFO] ---> fbc5e8d75beb
[INFO] Successfully built fbc5e8d75beb
[INFO] Successfully tagged springio/test-springboot:latest
[INFO]
[INFO] Detected build of image with id fbc5e8d75beb
[INFO] Building jar: /home/chench/workspace/java/test-springboot/target/test-springboot-0.0.1-dev-docker-info.jar
[INFO] Successfully built springio/test-springboot:latest
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:41 min
[INFO] Finished at: 2018-05-07T10:41:05+08:00
[INFO] Final Memory: 47M/132M
[INFO] ------------------------------------------------------------------------
从构建日志中可以很清晰地看到,一开始下载Maven的依赖配置,随后就开始使用Dockerfile中的构建指令定制镜像,并且将项目根路径作为构建上下文。
另外,在项目的target目录下将会生成一个名为docker的目录:

在该docker目录下存在如下几个文件:image-id,image-name,repository,tag,其中保存的就是最新构建出来的镜像信息。

构建完毕之后查看在本地镜像仓库是否存在对应镜像:
$docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
springio/test-springboot latest fbc5e8d75beb 49 seconds ago 138MB
4.验证镜像是否正确
$docker run --name test-springboot -d -p 8080:8080 springio/test-springboot
438246b5f8e8ed7808b3127ed8fce867cd162f050135369c02f09cb2cdc8d49d
$docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
438246b5f8e8 springio/test-springboot "java -Djava.securit…" 5 seconds ago Up 4 seconds 0.0.0.0:8080->8080/tcp test-springboot

而且,还可以直接在docker run命令中传递环境变量设置Spring Boot应用程序的运行环境,如:-e "SPRING_PROFILES_ACTIVE=test"。
$docker run --name test-springboot-env2 -e "SPRING_PROFILES_ACTIVE=test" -p 8080:8080 -d springio/test-springboot
5.将镜像推送到仓库
有2种方式可以实现将构建好的Spring Boot应用程序镜像推送到镜像仓库:
(1)构建完毕之后手动推送
mvn dockerfile:push
(2)配置Maven插件在构建完毕之后自动推送
<!-- 使用Maven插件直接将应用打包为一个Docker镜像 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
<!-- 镜像构建完毕之后自动推送到仓库 -->
<executions>
<execution>
<id>default</id>
<phase>install</phase>
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
</plugin>
注意事项
1.可以使用Maven插件便捷地构建Spring Boot应用程序的Docker镜像,但是最核心的还是如何编写Dockerfile构建脚本。
2.在使用Maven插件构建Spring Boot应用程序镜像时,会使用应用程序根路径作为构建上下文。
【参考】
https://spring.io/guides/gs/spring-boot-docker/
使用Maven插件构建Spring Boot应用程序镜像的更多相关文章
- 构建Spring Boot程序有用的文章
构建Spring Boot程序有用的文章: http://www.jb51.net/article/111546.htm
- SpringBoot之二:部署Spring Boot应用程序方式
衡量多种部署方式 Spring Boot应用程序有多种构建和运行方式,其中一些你已经使用过了. 在IDE中运行应用程序(涉及Spring ToolSuite或IntelliJ IDEA). 使用Mav ...
- 峰哥说技术:02-第一个Spring Boot应用程序
Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 02第一个Spring Boot应用程序 1.版本要求 集成开发环境:IntelliJ IDEA 2017 ...
- Spring Boot入门程序
创建第一个Spring Boot的入门程序. 带你一步一步的,搭建第一个Spring Boot 的入门程序,并成功运行,通过实践过程,初步认识和了解如何使用Spring Boot 创建应用程序. 一. ...
- 将Spring Boot应用程序迁移到Java9:兼容性
将 Spring Boot 应用程序迁移到 Java 9:兼容性 随着 Java 9 的到来,关于如何迁移应用程序以使用模块系统有很多的讨论.遗憾的是,大多数文章的焦点都集中于简单的 Hello Wo ...
- 三十二张图告诉你,Jenkins构建Spring Boot 有多简单~
持续原创输出,点击上方蓝字关注我 目录 前言 如何安装Jenkins? 环境准备 开始安装Jenkins 初始化配置 访问首页 输入管理员密码 安装插件 创建管理员 实例配置 配置完成 构建Sprin ...
- docker 部署Spring Boot:Docker化Spring Boot应用程序
第一章 1.创建项目存放目录 mkdir /root/sproot -p 2.准备好Spring Boot应用程序 jar 包 testrest.jar 第二章 1. 安装docker 在所有节点执行 ...
- Spring Boot入门程序-STS
使用Eclipse EE 中的 Spring Tool插件,完成 第一个Spring Boot应用程序的创建. 一.安装Spirng Tool插件 在 Eclipse EE Oxygen版本,安装“S ...
- Maven插件构建Docker镜像
背景 微服务架构下,微服务在带来良好的设计和架构理念的同时,也带来了运维上的额外复杂性,尤其是在服务部署和服务监控上.单体应用是集中式的,就一个单体跑在一起,部署和管理的时候非常简单,而微服务是一个网 ...
随机推荐
- HybridStart混合应用开发框架
转自我的博客,原文地址:http://refined-x.com/2017/06/26/%E5%9F%BA%E4%BA%8EAPICloud%E7%9A%84%E6%B7%B7%E5%90%88%E5 ...
- c#实验一:基于winform的冒泡排序练习
一.界面设计 在排序前textbox中输入数字,以逗号隔开,通过两个button实现降序排序或升序排序,然后在排序后textbox中显示 三个关键点: 1.监测输入是否合法,最好使用正则表达式 2.拆 ...
- threejs学习笔记(二)
THREE.WebGLRenderer THREE.Scene THREE.OrthographicCamera正交相机 THREE.PerspectiveCamera透视相机 renderer.se ...
- web框架开发-快速认识Django中间件
中间件 中间件的概念 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出. 因为改变的是全局,所以需要谨慎实用,用不 ...
- GXOI/GZOI2019题解
GXOI/GZOI2019题解 P5300 [GXOI/GZOI2019]与或和 一眼题.. 显然枚举每个二进制位,答案就变成了全1子矩阵数量. 这个xjb推推,单调栈一下就行了. #include& ...
- CSL 的魔法
链接 [https://ac.nowcoder.com/acm/contest/551/E] 分析 很显然就是a的第k大得和b的倒数第k大相乘. 那么我们只要让a的第k大和b的倒数第k大位置是相同的即 ...
- es6可变参数-扩展运算符
es5中参数不确定个数的情况下: //求参数和 function f(){ var a = Array.prototype.slice.call(arguments); var sum = 0; a. ...
- 在写php项目时 修改外部css或js文件没有效果
原因是:浏览器的自动缓存机制导致的. 这是因为浏览器会自动缓存静态文件以加快访问速度,所以这就导致浏览器将不会再接收静态文件了 解决办法是 使用ctrl+F5 —— 传说中的完全刷新,会删掉所有本地临 ...
- SSH 协议的 ssh StrictHostKeyChecking
项目的SFTP用到了这个参数: @Override public PooledObject<ChannelSftp> makeObject() throws Exception { JSc ...
- js对象取值的两种方式
:"李四"}; var v1 = obj.name1; //张三, 使用点的方式 //报错,不能使用点的方式 ]; //李四,使用中括号的方式 var key = "na ...