使用Maven插件构建Spring Boot应用程序的Docker镜像。

环境准备

1.Linux系统

2.安装JDK,Maven

3.安装Docker

应用实践

1.在应用程序根目录下添加Dockerfile文件

并在Dockerfile中编辑构建内容:

  1. FROM openjdk:8-jdk-alpine
  2. VOLUME /tmp
  3. ARG JAR_FILE
  4. COPY ${JAR_FILE} app.jar
  5. ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

2.在项目pom.xml中添加docker镜像构建插件dockerfile-maven-plugin

  1. <build>
  2. <plugins>
  3. <!-- 使用Maven插件直接将应用打包为一个Docker镜像 -->
  4. <plugin>
  5. <groupId>com.spotify</groupId>
  6. <artifactId>dockerfile-maven-plugin</artifactId>
  7. <version>1.3.6</version>
  8. <configuration>
  9. <repository>${docker.image.prefix}/${project.artifactId}</repository>
  10. <buildArgs>
  11. <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
  12. </buildArgs>
  13. </configuration>
  14. </plugin>
  15. </plugins>
  16. </build>

显然,在插件dockerfile-maven-plugin中配置了2个参数:

  • <repository>:指定镜像仓库信息及镜像名称,如:springio/test-springboot
  • <buildArgs>:设置构建参数,该参数可以直接在Dockerfile中使用(但是必须在Dockerfile使用ARG指令声明)

3.执行构建

在Spring Boot应用根目录下执行构建:

  1. mvn install dockerfile:build

将会看到如下构建日志:

  1. ...
  2. [INFO] Building Docker context /home/chench/workspace/java/test-springboot
  3. [INFO]
  4. [INFO] Image will be built as springio/test-springboot:latest
  5. [INFO]
  6. [INFO] Step 1/5 : FROM openjdk:8-jdk-alpine
  7. [INFO]
  8. [INFO] Pulling from library/openjdk
  9. [INFO] Image ff3a5c916c92: Pulling fs layer
  10. [INFO] Image 5de5f69f42d7: Pulling fs layer
  11. [INFO] Image fd869c8b9b59: Pulling fs layer
  12. [INFO] Image 5de5f69f42d7: Downloading
  13. [INFO] Image 5de5f69f42d7: Verifying Checksum
  14. [INFO] Image 5de5f69f42d7: Download complete
  15. [INFO] Image ff3a5c916c92: Downloading
  16. [INFO] Image fd869c8b9b59: Downloading
  17. [INFO] Image ff3a5c916c92: Verifying Checksum
  18. [INFO] Image ff3a5c916c92: Download complete
  19. [INFO] Image ff3a5c916c92: Extracting
  20. [INFO] Image ff3a5c916c92: Pull complete
  21. [INFO] Image 5de5f69f42d7: Extracting
  22. [INFO] Image 5de5f69f42d7: Pull complete
  23. [INFO] Image fd869c8b9b59: Verifying Checksum
  24. [INFO] Image fd869c8b9b59: Download complete
  25. [INFO] Image fd869c8b9b59: Extracting
  26. [INFO] Image fd869c8b9b59: Pull complete
  27. [INFO] Digest: sha256:e82316151c501a2a0f73b3089da8dc867816470a464fcb191db9f88c2343ad53
  28. [INFO] Status: Downloaded newer image for openjdk:8-jdk-alpine
  29. [INFO] ---> 224765a6bdbe
  30. [INFO] Step 2/5 : VOLUME /tmp
  31. [INFO]
  32. [INFO] ---> Running in 99fc0b2bbcf7
  33. [INFO] Removing intermediate container 99fc0b2bbcf7
  34. [INFO] ---> 74c89740c46e
  35. [INFO] Step 3/5 : ARG JAR_FILE
  36. [INFO]
  37. [INFO] ---> Running in 54d9bf00c9c6
  38. [INFO] Removing intermediate container 54d9bf00c9c6
  39. [INFO] ---> 81d324efe92b
  40. [INFO] Step 4/5 : COPY ${JAR_FILE} app.jar
  41. [INFO]
  42. [INFO] ---> f11354b41c33
  43. [INFO] Step 5/5 : ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
  44. [INFO]
  45. [INFO] ---> Running in 74d40fc4f99c
  46. [INFO] Removing intermediate container 74d40fc4f99c
  47. [INFO] ---> fbc5e8d75beb
  48. [INFO] Successfully built fbc5e8d75beb
  49. [INFO] Successfully tagged springio/test-springboot:latest
  50. [INFO]
  51. [INFO] Detected build of image with id fbc5e8d75beb
  52. [INFO] Building jar: /home/chench/workspace/java/test-springboot/target/test-springboot-0.0.1-dev-docker-info.jar
  53. [INFO] Successfully built springio/test-springboot:latest
  54. [INFO] ------------------------------------------------------------------------
  55. [INFO] BUILD SUCCESS
  56. [INFO] ------------------------------------------------------------------------
  57. [INFO] Total time: 02:41 min
  58. [INFO] Finished at: 2018-05-07T10:41:05+08:00
  59. [INFO] Final Memory: 47M/132M
  60. [INFO] ------------------------------------------------------------------------

从构建日志中可以很清晰地看到,一开始下载Maven的依赖配置,随后就开始使用Dockerfile中的构建指令定制镜像,并且将项目根路径作为构建上下文。

另外,在项目的target目录下将会生成一个名为docker的目录:

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

构建完毕之后查看在本地镜像仓库是否存在对应镜像:

  1. $docker image ls
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. springio/test-springboot latest fbc5e8d75beb 49 seconds ago 138MB

4.验证镜像是否正确

  1. $docker run --name test-springboot -d -p 8080:8080 springio/test-springboot
  2. 438246b5f8e8ed7808b3127ed8fce867cd162f050135369c02f09cb2cdc8d49d
  3. $docker container ps
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. 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"

  1. $docker run --name test-springboot-env2 -e "SPRING_PROFILES_ACTIVE=test" -p 8080:8080 -d springio/test-springboot

5.将镜像推送到仓库

有2种方式可以实现将构建好的Spring Boot应用程序镜像推送到镜像仓库:

(1)构建完毕之后手动推送

  1. mvn dockerfile:push

(2)配置Maven插件在构建完毕之后自动推送

  1. <!-- 使用Maven插件直接将应用打包为一个Docker镜像 -->
  2. <plugin>
  3. <groupId>com.spotify</groupId>
  4. <artifactId>dockerfile-maven-plugin</artifactId>
  5. <version>1.3.6</version>
  6. <configuration>
  7. <repository>${docker.image.prefix}/${project.artifactId}</repository>
  8. <buildArgs>
  9. <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
  10. </buildArgs>
  11. </configuration>
  12. <!-- 镜像构建完毕之后自动推送到仓库 -->
  13. <executions>
  14. <execution>
  15. <id>default</id>
  16. <phase>install</phase>
  17. <goals>
  18. <goal>build</goal>
  19. <goal>push</goal>
  20. </goals>
  21. </execution>
  22. </executions>
  23. </plugin>

注意事项

1.可以使用Maven插件便捷地构建Spring Boot应用程序的Docker镜像,但是最核心的还是如何编写Dockerfile构建脚本。

2.在使用Maven插件构建Spring Boot应用程序镜像时,会使用应用程序根路径作为构建上下文。

【参考】

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

使用Maven插件构建Spring Boot应用程序镜像的更多相关文章

  1. 构建Spring Boot程序有用的文章

    构建Spring Boot程序有用的文章: http://www.jb51.net/article/111546.htm

  2. SpringBoot之二:部署Spring Boot应用程序方式

    衡量多种部署方式 Spring Boot应用程序有多种构建和运行方式,其中一些你已经使用过了. 在IDE中运行应用程序(涉及Spring ToolSuite或IntelliJ IDEA). 使用Mav ...

  3. 峰哥说技术:02-第一个Spring Boot应用程序

    Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 02第一个Spring Boot应用程序 1.版本要求 集成开发环境:IntelliJ IDEA 2017 ...

  4. Spring Boot入门程序

    创建第一个Spring Boot的入门程序. 带你一步一步的,搭建第一个Spring Boot 的入门程序,并成功运行,通过实践过程,初步认识和了解如何使用Spring Boot 创建应用程序. 一. ...

  5. 将Spring Boot应用程序迁移到Java9:兼容性

    将 Spring Boot 应用程序迁移到 Java 9:兼容性 随着 Java 9 的到来,关于如何迁移应用程序以使用模块系统有很多的讨论.遗憾的是,大多数文章的焦点都集中于简单的 Hello Wo ...

  6. 三十二张图告诉你,Jenkins构建Spring Boot 有多简单~

    持续原创输出,点击上方蓝字关注我 目录 前言 如何安装Jenkins? 环境准备 开始安装Jenkins 初始化配置 访问首页 输入管理员密码 安装插件 创建管理员 实例配置 配置完成 构建Sprin ...

  7. docker 部署Spring Boot:Docker化Spring Boot应用程序

    第一章 1.创建项目存放目录 mkdir /root/sproot -p 2.准备好Spring Boot应用程序 jar 包 testrest.jar 第二章 1. 安装docker 在所有节点执行 ...

  8. Spring Boot入门程序-STS

    使用Eclipse EE 中的 Spring Tool插件,完成 第一个Spring Boot应用程序的创建. 一.安装Spirng Tool插件 在 Eclipse EE Oxygen版本,安装“S ...

  9. Maven插件构建Docker镜像

    背景 微服务架构下,微服务在带来良好的设计和架构理念的同时,也带来了运维上的额外复杂性,尤其是在服务部署和服务监控上.单体应用是集中式的,就一个单体跑在一起,部署和管理的时候非常简单,而微服务是一个网 ...

随机推荐

  1. PowerShell执行脚本时“系统上禁止运行脚本”问题解决

    PowerShell执行脚本策略错误 错误信息:PowerShell运行脚本错误--"系统上禁止运行脚本" 原因:默认执行策略为Restricted 解决:执行Set-Execut ...

  2. Java开发学习心得(一):SSM环境搭建

    目录 Java开发学习心得(一):SSM环境搭建 1 SSM框架 1.1 Spring Framework 1.2 Spring MVC Java开发学习心得(一):SSM环境搭建 有一点.NET的开 ...

  3. FutureTask并发详解,通俗易懂

    最近做项目,使用到了FutureTask和主线程并发,应用到实际中还是挺实用的,特在此总结一下. 有不对之处,忘各位多多指出. package com.demo; import java.util.c ...

  4. 001_python多进程实例

    一.工作中需要执行zk数据对比,需要按照机器进行并发,举例以下的例子 # coding:utf8 # !/usr/bin/python import time from multiprocessing ...

  5. js如何调用php文件内显示的数值到html?

    index.html <script type="text/javascript" src="https://cdn.bootcss.com/jquery/1.9. ...

  6. 引用传递this关键字

    this关键字主要有三个应用: (1)this调用本类中的属性,也就是类中的成员变量: (2)this调用本类中的其他方法: (3)this调用本类中的其他构造方法,调用时要放在构造方法的首行.  

  7. JSOI2019 Round2 极限生还

    江苏省省队一共13个名额,去掉女生名额, 按1/3校内限制,我们南外只有4个名额, 在noip爆炸(占比35%),省选一轮爆炸(占比40%),(此时蒟蒻在校内排不进前10...) 总算在省选二轮(占比 ...

  8. hadoop 集群 master datanode 没有启动

    2018-02-07 02:47:50,377 WARN org.apache.hadoop.hdfs.server.common.Storage: java.io.IOException: Inco ...

  9. 定时任务 cron命令

    一名linux新手,因为项目需要现在在学习linux操作系统. 因项目需要做一个定时任务,每个小时访问某一个url一次,通过参考很多大神的博客学会了crontab命令的使用方法 crontab -u ...

  10. [转帖] CA如何保护自己的私钥

    作者:Gh0u1L5链接:https://www.zhihu.com/question/22260090/answer/648910720来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业 ...