多阶段分层构建容器化Spring Boot应用程序

上一节中,容器化spring boot应用程序-CSDN博客我们介绍了基于简单的Dockerfile对spring boot进行容器化的过程,本讲将介绍如何基于Dockerfile进行多阶段的分层构建过程,希望对大家有所帮助。

Spring Boot从版本2.3.0开始支持分层构建容器化的镜像,在使用时需要注意,本文使用的spring boot的版本是:3.3.1

创建spring boot应用程序

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>3.3.1</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.zgy</groupId><artifactId>container_docker</artifactId><version>0.0.1-SNAPSHOT</version><name>container_docker</name><description>container_docker</description><properties><java.version>17</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></dependency><!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.14.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>3.3.1</version><configuration><layers><enabled>true</enabled></layers><loaderImplementation>CLASSIC</loaderImplementation></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>

需要注意的是使用的maven插件:spring-boot-maven-plugin ,为了使用容器化分层的能力,需要进行如下配置:

<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>3.3.1</version><configuration><layers><enabled>true</enabled></layers><loaderImplementation>CLASSIC</loaderImplementation></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions>
</plugin>

如上图,需要关注configuration部分的配置以及executions中的设置,否则会导致后续分层配置的失败,本文是经过测试可使用的,大家可以直接复制即可。

创建应用的端点

@RestController
@RequestMapping(value = "/layer")
public class LayerController {@GetMapping(value = "test")public void test() {System.out.println("layers/test/....");}@GetMapping(value = "tttest")public void tttest() {System.out.println("ttt test test!!");}
}

如上图,创建了一个controller类,用于启动容器后的测试。

打包

mvn clean package

执行该命令后,会在target目录下创建*.jar的包,这个需要后续上传到linux上用于进行镜像的构建

Dockerfile配置文件

FROM openjdk:17-jdk-alpine as builder
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jarRUN java -Djarmode=layertools -jar application.jar extract
FROM openjdk:17-jdk-alpine
RUN mkdir app
WORKDIR app
COPY --from=builder dependencies/ ./
COPY --from=builder snapshot-dependencies/ ./
COPY --from=builder spring-boot-loader/ ./
COPY --from=builder application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.launch.JarLauncher"]
FROM openjdk:17-jdk-alpine as builder

该命令拉取open jdk 17的镜像,并将其作为第一个阶段

ARG JAR_FILE=target/*.jar

定义参数JAR_FILE,其值为之前打包的jar包程序

COPY ${JAR_FILE} application.jar

将打包后的jar包复制到容器内部,并重命名为application.jar

RUN java -Djarmode=layertools -jar application.jar extract

该命令是从application.jar中提取分层后的部分,这也是在maven中添加maven插件并添加配置的原因,否则无法提取jar包中的层级

FROM openjdk:17-jdk-alpine

开始第二个阶段,并使用jdk 17的镜像

RUN mkdir app

在容器内部创建目录app

WORKDIR app

将目录app作为上下文的工作环境

COPY --from=builder dependencies/ ./
COPY --from=builder snapshot-dependencies/ ./
COPY --from=builder spring-boot-loader/ ./
COPY --from=builder application/ ./

使用第一个阶段的内容,并将分层后的各个部分逐一的复制到容器内部

ENTRYPOINT ["java", "org.springframework.boot.loader.launch.JarLauncher"]

容器启动后,启动应用程序,需要注意的是,我们不是使用的jar -jar application.jar,而是使用的org.springframework.boot.loader.launch.JarLauncher,这个需要设置正确,否则会导致找不到启动类的报错。

构建镜像

上传资源

将target目录以及Dockerfile上传到linux中,用于构建镜像,linux上传后的目录如下所示

构建镜像

docker  build -t layer:v1 .

镜像构建后,可以看到如下镜像  创建容器 

docker conainer run –p 3000:8080 –name layer layer:v1

可以通过调用自定义的端点,可以进行验证

后续代码发生变更后,通过以上步骤,重新打包、构建新的镜像、删除已有的容器并启动新的容器,便可完成进行新代码的部署工作 。后续执行镜像操作的过程中,会比较快,因为镜像会进行缓存,如下图所示

这也是docker镜像缓存以及spring boot支持分层所带来的优化效果 

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

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

相关文章

Mysql中varchar类型数字排序不对踩坑记录

场景 在进行表设计时将版本号字段设计了为varchar类型&#xff0c;尽量从表设计阶段将数字类型列设计为int型。 再进行排序时如果版本号累计到了10及以上&#xff0c;那么再进行排序时则会出现问题。 比如下面执行排序时发现10被排在了第一位。 这是因为 varchar类型对数字…

已备案网站变更并且不影响现有业务的方案

已备案网站变更并且不影响现有业务的方案 近日有个工作上的需求&#xff0c;已备案网站变更并且不影响现有业务&#xff0c;记录一下。 需求 域名&#xff1a;XXXXXX.com备案变更前主体&#xff1a; 海南XXXXXX科技有限公司 备案变更后主体&#xff1a; 深圳XXXXXX科技有限…

【05】从0到1构建AI生成思维导图应用 -- 前端交互实现

【05】从0到1构建AI生成思维导图应用 – 前端交互实现 大家好&#xff01;最近自己做了一个完全免费的AI生成思维导图的网站&#xff0c;支持下载&#xff0c;编辑和对接微信公众号&#xff0c;可以在这里体验&#xff1a;https://lt2mind.zeabur.app/ 上一章&#xff1a;http…

【图解大数据技术】Hive、HBase

【图解大数据技术】Hive、HBase Hive数据仓库Hive的执行流程Hive架构数据导入Hive HBaseHBase简介HBase架构HBase的列式存储HBase建表流程HBase数据写入流程HBase数据读取流程 Hive Hive是基于Hadoop的一个数据仓库工具&#xff0c;Hive的数据存储在HDFS上&#xff0c;底层基于…

容器进程

一、容器进程和宿主机进程的关系 容器在进程空间上和宿主机是隔离的&#xff0c;每创建一个容器&#xff0c;该容器都有一个独属的进程空间简称PID NameSpace。但是容器本质也是一个进程&#xff0c;自然是由其父进程创建的&#xff0c;这个可以使用ps aux命令验证。 | 容器视…

Tesseract Python 图片文字识别入门

1、安装tesseract Index of /tesseract https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-w64-setup-v5.3.0.20221214.exe 2、安装中文语言包 https://digi.bib.uni-mannheim.de/tesseract/tessdata_fast/ 拷贝到C:\Program Files\Tesseract-OCR\tessdata 3、注…

ISO26262标准

什么是ISO26262&#xff1f; ISO 26262(国际功能安全标准)是一个涵盖整个汽车产品开发过程的汽车功能安全标准。ISO 26262继承或改编自工业自动化行业的安全要求标准IEC61508&#xff0c;但专门为汽车行业量身定制。最新版本是ISO26262-1:2018。 它包括诸如需求分析、安全分析…

STM32CubeMx的学习记录系列(2)- STM32G474RET6

最近有个小比赛&#xff0c;需要用到G4&#xff0c;不过找了一圈没有找到标准库的代码&#xff0c;只能使用hal&#xff0c;用CubeMX来生成配置代码。 共同特点 ARDUINO Uno V3 扩展连接器 ST morpho 扩展引脚接头&#xff0c;可完全访问所有 STM32 I/O 采用LQFP64或LQFP48封…

2-requests模块(6节课学会爬虫)

2-requests模块&#xff08;6节课学会爬虫&#xff09; 1&#xff0c;安装requests2&#xff0c;发送get&#xff0c;post请求&#xff0c;获取响应3&#xff0c;response的方法方法一&#xff08;Response.text&#xff09;方法二&#xff08;response.content.decode()&#…

Docker 查看源地址/仓库地址,更改

一、源地址文件配置路径。若有docker文件夹&#xff0c;没有json&#xff0c;可以新增&#xff0c;复制进去内容 /etc/docker/daemon.json {"registry-mirrors": ["https://dockerhub.azk8s.cn","https://hub-mirror.c.163.com"&#xff0c;&q…

【数据分析】1、用Pandas计算数据相关性系数

相关性系数和相关分析是了解变量之间关系的重要工具。通过合理选择相关性系数和科学分析数据&#xff0c;能够有效揭示变量之间的关系&#xff0c;为进一步研究和决策提供有力支持。在实际应用中&#xff0c;应结合业务背景、数据特性和统计原则&#xff0c;谨慎解释和应用相关…

【小学期】常用基于Swing的七个静态界面

示例1&#xff1a;基本的带按钮和标签的界面 import javax.swing.*; import java.awt.*;public class SimpleSwingApp1 {public static void main(String[] args) {JFrame frame new JFrame("Simple Swing App 1");frame.setDefaultCloseOperation(JFrame.EXIT_ON_C…

【linux】从零到入门

linux概述 Linux是一个免费使用和自由传播的一套操作系统。用户可以无偿地得到它地源代码&#xff0c;和大量地应用程序&#xff0c;并且可以随意修改和增加它们。 Linux的内核起初由林纳斯编写。内核是啥&#xff1f; 驱动设备&#xff0c;文件系统&#xff0c;进程管理&…

UE5(c++)demo开发日志(1):Actor类添加

工具---新建c类---选用Actor&#xff0c;创造出头文件(.h&#xff0c;用于声明变量、函数、重写父类函数等)和源文件(.cpp&#xff0c;涉及到具体功能实现)&#xff0c;客户端界面成功显示出来新建类&#xff1a; Actor头文件默认方法简介&#xff1a; UCLASS(): ue提供的宏&a…

算法-位运算基础

文章目录 1. 前置知识2. 交换两个数3. 比较两个数的大小3. leetcode268 寻找缺失的数字4. leetcode136 只出现一次的数字5. leetcode260 只出现一次的数字|||6. leetcode137 只出现一次的数字||7. 2/3的幂8. 大于等于该数字的最小2的幂9. leetcode201 数字范围按位与10. 位运算…

Docker部署Dillinger个人文本编辑器

Docker部署Dillinger个人文本编辑器 一、Dillinger介绍1.1 Dillinger简介1.2 Dillinger使用场景 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、拉取Dillinger镜像五、部署Dill…

汇聚荣拼多多运营好吗?

在当前电商行业竞争激烈的背景下&#xff0c;拼多多凭借其独特的商业模式和市场定位迅速崛起&#xff0c;成为众多商家和品牌争相入驻的平台。对于“汇聚荣拼多多运营好吗?”这一问题&#xff0c;答案是肯定的。拼多多不仅提供了一个广阔的市场空间&#xff0c;还通过其创新的…

HTML5+JavaScript单词游戏

HTML5 JavaScript单词游戏 数据字典格式&#xff1a;每行一个 单词 &#xff0c;单词和解释用空格分隔&#xff0c;如 a art.一(个)&#xff1b;每一(个) ability n.能力&#xff1b;能耐&#xff0c;本领 able a.有能力的&#xff1b;出色的 baby n.婴儿&#xff1b;孩子…

数据库对比脚本,java如何对比两个数据库的表字段的不同

因为有时候开发环境和 测试环境&#xff0c;有时候会有不同的数据库表&#xff0c;比如有些加字段了&#xff0c;所以这个脚本就实现了对比两个数据库连接的数据库到底哪里不一样&#xff0c;输出到控制台 package com.junfun.pms;import lombok.extern.slf4j.Slf4j;import ja…

25届最近5年北京工业大学自动化考研院校分析

北京工业大学 目录 一、学校学院专业简介 二、考试科目指定教材 三、近5年考研分数情况 四、近5年招生录取情况 五、最新一年分数段图表 六、初试大纲复试大纲 七、学费&奖学金&就业方向 一、学校学院专业简介 二、考试科目指定教材 1、考试科目介绍 2、指定教…