SpringBoot打包成Docker镜像

1. 本文环境

Maven:3.6.3 (Maven配置参考)

SpringBoot version:2.3.4.RELEASE

Docker version: 19.03.11 (Docker搭建参考)

JDK version:1.8.0_221 (JDK搭建参考)

dev tools:IDEA (IDEA破解参考)

环境说明:本地跟docker不在同一环境,docker为单独服务器。

2. 准备工作

通过 IDEA -> Spring Initializr 快速创建一个 SpringBoot 应用

填写项目名、选择 jdk 版本:

之后操作一路「蓝色按钮」默认即可。

创建后的项目 pom.xml 文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>springboot-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot-demo</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

3. Maven dockerfile 插件

将 SpringBoot 项目打包成 Docker 镜像,其主要通过 Maven plugin 插件来进行构建。

在之前都是通过 docker-maven-plugin 插件进行打包,而现在已经升级出现了新的插件:

dockerfile-maven-plugin

接下来我们就是通过这个 plugin 插件进行操作。

<plugin><groupId>com.spotify</groupId><artifactId>dockerfile-maven-plugin</artifactId><version>1.4.13</version><executions><execution><id>default</id><goals><goal>build</goal><goal>push</goal></goals></execution></executions><configuration><repository>${docker.image.prefix}/${project.artifactId}</repository><tag>${project.version}</tag><buildArgs><JAR_FILE>${project.build.finalName}.jar</JAR_FILE></buildArgs></configuration>
</plugin>

参数说明:

  • repository:指定Docker镜像的repo名字,要展示在docker images 中的。

  • tag:指定Docker镜像的tag,不指定tag默认为latest

  • buildArgs:指定一个或多个变量,传递给Dockerfile,在Dockerfile中通过ARG指令进行引用。JAR_FILE 指定 jar 文件名。

另外,可以在execution中同时指定build和push目标。当运行mvn package时,会自动执行build目标,构建Docker镜像。

DockerFile

DockerFile 文件需要放置在项目 pom.xm l同级目录下,内容大致如下:

FROM java:8
EXPOSE 8080
ARG JAR_FILE
ADD target/${JAR_FILE} /niceyoo.jar
ENTRYPOINT ["java", "-jar","/niceyoo.jar"]

参数说明:

  • FROM:基于java:8镜像构建
  • EXPOSE:监听8080端口
  • ARG:引用plugin中配置的 JAR_FILE 文件
  • ADD:将当前 target 目录下的 jar 放置在根目录下,命名为 niceyoo.jar,推荐使用绝对路径。
  • ENTRYPOINT:执行命令 java -jar /niceyoo.jar

当前完整的 pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>springboot-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot-demo</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><docker.image.prefix>niceyoo</docker.image.prefix></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>com.spotify</groupId><artifactId>dockerfile-maven-plugin</artifactId><version>1.4.13</version><executions><execution><id>default</id><goals><goal>build</goal><goal>push</goal></goals></execution></executions><configuration><repository>${docker.image.prefix}/${project.artifactId}</repository><tag>${project.version}</tag><buildArgs><JAR_FILE>${project.build.finalName}.jar</JAR_FILE></buildArgs></configuration></plugin></plugins></build></project>

项目截图:

4. 使用误区

docker-maven-plugin 和 dockerfile-maven-plugin 使用误区。

我们之前在使用 docker-maven-plugin 插件时,可以直接在本地就可以完成打包并推送镜像至远程仓库,即 SpringBoot项目构建 docker 镜像并推送到远程仓库:

<plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>1.0.0</version><configuration><!--镜像名称--><imageName>10.211.55.4:5000/${project.artifactId}</imageName><!--指定dockerfile路径--><!--<dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>--><!--指定标签--><imageTags><imageTag>latest</imageTag></imageTags><!--远程仓库地址--><registryUrl>10.211.55.4:5000</registryUrl><pushImage>true</pushImage><!--基础镜像jdk1.8--><baseImage>java</baseImage><!--制作者提供本人信息--><maintainer>niceyoo apkdream@163.com</maintainer><!--切换到ROOT目录--><workdir>/ROOT</workdir><cmd>["java","-version"]</cmd><entryPoint>["java","-jar","${project.build.finalName}.jar"]</entryPoint><!--指定远程docker地址--><dockerHost>http://10.211.55.4:2375</dockerHost><!--这里是复制jar包到docker容器指定目录配置--><resources><resource><targetPath>/ROOT</targetPath><!--指定需要复制的根目录,${project.build.directory}表示target目录--><directory>${project.build.directory}</directory><!--用于指定需要复制的文件,${project.build.finalName}.jar表示打包后的jar包文件--><include>${project.build.finalName}.jar</include></resource></resources></configuration>
</plugin>

使用如上配置时,当执行 mvn package docker:build,即可完成打包至 docker 镜像中。

但是,Dockerfile 就不一样了,从我们开始编写 Dockerfile 文件 FROM 命令开始,我们就发现,这个必须依赖于Docker,但问题就是,假设我本地跟 Docker 并不在一台机器上,那么我是没法执行 dockerfile 的,如果在本地不安装 docker 环境下,是没法执行打包操作的,那么就可以将代码拉取到 Docker 所在服务器,执行打包操作。

5. 项目打包

项目代码结构:

执行 mvn clean package dockerfile:build -Dmaven.test.skip=true

执行 docker images 查看

至此,springboot 的镜像就制作完成了。

6. 创建镜像容器

上边的步骤镜像创建后,我们就可以直接来创建 springboot 容器来运行了。

docker run -d -p 8080:8080 10.211.55.4:5000/springboot-demo:0.0.1-SNAPSHOT
  • -d:表示在后台运行

  • -p:指定端口号,第一个8080为容器内部的端口号,第二个8080为外界访问的端口号,将容器内的8080端口号映射到外部的8080端口号

  • 10.211.55.4:5000/springboot-demo:0.0.1-SNAPSHOT:镜像名+版本号。

如果觉得镜像名称过长的话,可以重命名:

docker tag 镜像IMAGEID 新的名称:版本号

以 10.211.55.4:5000/springboot-demo 为例:

docker tag 1815d40a66ae demo:latest

如果版本号不加的话,默认为 latest

博客首发地址:https://www.cnblogs.com/niceyoo/p/13796792.html

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

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

相关文章

[js] 如何判断两个对象相等?

[js] 如何判断两个对象相等&#xff1f; 提供另一种写法&#xff1a;function isSameObject(object1, object2) {if (Object.prototype.toString.call(object1) [object Object] &&Object.prototype.toString.call(object2) [object Object]) {if (Object.keys(obje…

南京市儿童医院用医保身份(医保通道)网上预约挂号以及取号、付费看病流程...

1、到http://www.nj12320.org去注册&#xff0c;并实名认证&#xff08;可以用南京市民卡或者工行卡实名认证&#xff09; 2、到12320去挂儿童医院的号&#xff0c;我看了下只能挂副主任医师或者主任医师&#xff0c;或者按科室提前挂号&#xff0c;至少需要提前一天预约挂号&a…

Redis分布式锁—SETNX+Lua脚本实现篇

前言 平时的工作中&#xff0c;由于生产环境中的项目是需要部署在多台服务器中的&#xff0c;所以经常会面临解决分布式场景下数据一致性的问题&#xff0c;那么就需要引入分布式锁来解决这一问题。 针对分布式锁的实现&#xff0c;目前比较常用的就如下几种方案&#xff1a;…

[js] 字符串拼接有哪些方式?哪种性能好?

[js] 字符串拼接有哪些方式&#xff1f;哪种性能好&#xff1f; 1.使用 号 2.es6模板字符串&#xff0c;以反引号&#xff08; &#xff09;标识 3.concat 4.数组方法join性能最好的是连接&#xff1a; 继续补充&#xff1a;Array.prototype.reduceString.prototype.padSta…

Windows10远程报错:由于CredSSP加密Oracle修正

https://support.microsoft.com/zh-cn/help/4093492/credssp-updates-for-cve-2018-0886-march-13-2018 参照官方更新文件&#xff1a;查找办法 https://support.microsoft.com/zh-cn/help/4093492/&#xff0c;4093492是更新包kb后面的数字 修改办法&#xff1a;下图参照注册表…

Redis分布式锁—Redisson+RLock可重入锁实现篇

前言 平时的工作中&#xff0c;由于生产环境中的项目是需要部署在多台服务器中的&#xff0c;所以经常会面临解决分布式场景下数据一致性的问题&#xff0c;那么就需要引入分布式锁来解决这一问题。 针对分布式锁的实现&#xff0c;目前比较常用的就如下几种方案&#xff1a;…

[js] localStorage什么时候过期?

[js] localStorage什么时候过期&#xff1f; 默认不会过期&#xff0c;除非清楚浏览器缓存或者手动删除&#xff0c;可以通过setItem里面缓存时间参数&#xff0c;取出来后做一个前后时间对比&#xff0c;如果超过时间限制的话就删除该缓存即可。个人简介 我是歌谣&#xff0…

angular安装记录

1. 安装node.js&#xff0c;下载地址&#xff1a;https://nodejs.org/en/download/&#xff0c;详细的安装教程参考这里&#xff1a;https://blog.csdn.net/u010255310/article/details/52205132 直接一路next就可以。安装好node后&#xff0c;会自动在path中配置了node的安装路…

[js]写一个获取非行间样式的方法

[js]写一个获取非行间样式的方法 window.getComputedStyle()?window.getComputedStyle(element).attribute:element.currentStyle.attribute个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 …

Docker (1) 基本概念和安装

Docker简介 什么是容器&#xff1f; 一种虚拟化的方案&#xff0c;操作系统级别的虚拟化。容器是一个轻量的、独立的、可执行的包&#xff0c;包含了执行它所需要的所有东西&#xff1a;代码、运行环境、系统工具、系统库、设置。很长一段时间中&#xff0c;容器是专门用于Linu…

[js] 写一个获取页面中所有checkbox的方法

[js] 写一个获取页面中所有checkbox的方法 function getAllCheckbox() {return [...document.querySelectorAll(input[typecheckbox])] }个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌…

vue获取浏览器地址栏参数(?及/)路由+非路由实现方式

1、? 参数 浏览器参数形式&#xff1a;http://javam4.com/m4detail?id1322914793170014208 1.1、路由取参方式 this.$route.query.id前端跳转方式&#xff1a; 一、onclick方式 <a title"测试数据"click"test(row.id)"target"_blank"&g…

python3.X 使用pip 离线安装whl包(转载)

转载https://blog.csdn.net/wangyaninglm/article/details/54177720 0. 绪论 断网的环境下配置python开发环境非常讨厌&#xff0c;本文旨在优雅暴力的解决这一问题。 生产环境 &#xff1a; windows 7 windows10 python 3.5.2 pip 1.5.2 友情提示&#xff1a;出现问题时候&…

[js] XML与JSON有什么的区别?

[js] XML与JSON有什么的区别&#xff1f; xml 可以设 id&#xff0c;用 include 之类的可以直接引用过来&#xff0c;甚至可以约定内容格式。 但 json 不依赖 js 等语言就很难完成了。好吧&#xff0c;广义上来讲&#xff0c; json 编译更简单易懂&#xff0c;体积更小&#x…

@RequestParam,@RequestBody,@PathVariable注解还分不清吗?

前言 在使用 SpringMVC 开发时&#xff0c;经常遇到前端传递的各种参数&#xff0c;比如 form 表单&#xff0c;JSON 数据&#xff0c;String[] 数组&#xff0c;再或者是最常见的 String 字符串等等&#xff0c;总之大部分场景都是在标题这三个注解来回切换&#xff0c;所以搞…

Android | Sqlite3

Android 数据库创建及使用: 创建: package he3.sd.dao;import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log;/*** Created by asd25 on 2018/6/11 0011.*/public clas…

[js] flash如何与js交互?

[js] flash如何与js交互&#xff1f; 当Flash置于HTML容器中时&#xff0c;经常会遇到AS与JS的通信问题&#xff0c;例如&#xff1a;JS能否调用AS中的变量、方法&#xff0c;AS能否调用JS中的变量、方法等等。答案是肯定的。随着技术的不断发展&#xff0c;解决方案也是多种多…

PHP文件下载

步骤 //流的方式发送给浏览器 header("Content-Type: application/octet-stream"); //按照字节的返回给浏览器 header("Accept-Ranges: bytes"); //告诉浏览器文件的大小 header("Accept-Length: ".filesize(文件地址)); //以附件的形式发送给浏…

面试官:了解二叉树吗,平衡二叉树,红黑树?

前言 面试过程中&#xff0c;多多少少会问一点数据结构&#xff08;二叉树&#xff09;的问题&#xff0c;今天我们来复习一下二叉树的相关问题&#xff0c;文末总结。 1. 二叉树的由来 在 jdk1.8 之前&#xff0c;HashMap 的数据结构由「数组链表」组成&#xff0c;数组是 …

[js] 说说你对js对象生命周期的理解

[js] 说说你对js对象生命周期的理解 一切皆对象 咱们经常听到JS中“一切皆对象”&#xff1f;有没有问想过这是什么意思&#xff1f;其它语言也有“一切皆对象”之说&#xff0c;如Python。但是Python中的对象不仅仅是像JS对象这样的存放值和值的容器。Python中的对象是一个类…