springboot服務(wù)docker打包分層的實(shí)現(xiàn)
前言
隨著云原生技術(shù)的發(fā)展,現(xiàn)在大部分企業(yè)項(xiàng)目都通過容器化來部署項(xiàng)目,不管是docker部署還是k8s都離不開打鏡像的環(huán)節(jié),傳統(tǒng)打鏡像的方式通常時(shí)間上會(huì)比較漫長(zhǎng),有時(shí)候改動(dòng)少量代碼就需要全部打包。今天來體驗(yàn)一下Springboot2.3.0后的分層打包功能。
普通打包
我們先新建一個(gè)添加了springboot依賴的maven測(cè)試項(xiàng)目,對(duì)于諸位老Javaboy來說屬于閉著眼操作了,默認(rèn)的maven項(xiàng)目里一般不會(huì)自動(dòng)添加上打包插件。最開始接觸springboot的時(shí)候使用maven package
打出來jar包啟動(dòng)會(huì)發(fā)現(xiàn)報(bào)錯(cuò)找不到入口類。
所以一定要在pom中加上
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>com.uptown.sign.SignApplication</mainClass> <layout>ZIP</layout> <fork>true</fork> <addResources>true</addResources> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
隨便寫一個(gè)hello world的控制器入口,然后直接編寫Dockerfile文件
FROM openjdk:8-jdk-alpine # 打包命令 RUN mvn package # 聲明一個(gè)端口但不真正運(yùn)行在這個(gè)端口 EXPOSE 8080 # 把打出來的包添加到鏡像中 ADD target/*.jar ./app.jar # 執(zhí)行命令 CMD java -jar app.jar
完事之后運(yùn)行命令打成鏡像測(cè)試
docker build . -t test:0.0.1
打出鏡像后查看鏡像的分層結(jié)構(gòu)。
docker inspect test:0.0.1
圖中的Layers就是鏡像層,docker是會(huì)按命令分層,我們把hello world改成fu ck work,重新執(zhí)行下上述步驟再docker inspect分析下新鏡像的Layers會(huì)發(fā)現(xiàn)
你會(huì)發(fā)現(xiàn)這些Layers中只有最后一處與舊鏡像內(nèi)容不一樣,我們僅僅只改動(dòng)了一個(gè)接口返回的文案,重新打包后會(huì)把所有動(dòng)作重新都做一邊,做完后發(fā)現(xiàn)打出來的鏡像每層基本都一樣,只有最后一層有變化,那么我們能不能只重新制作有變化的包呢。
分層打包
當(dāng)然是可以了,這就是springboot在230加的新特性,雖然現(xiàn)在springboot版本已經(jīng)出道3了,但是我認(rèn)為越迭代越重,加了很多可有可無的東西,不如老版本中一些好用的特性值得把玩。
根本原理其實(shí)是一個(gè)springboot打出jar包中主要包含四個(gè)部分,自己寫的代碼,第三方依賴、SpringBoot內(nèi)部配置、快照依賴 ,如果僅僅只是改動(dòng)了自己寫的代碼的話那其他那三部分根本不用變。也就是說如果你換了依賴版本那就不行了。
首先在pom中打開分層開關(guān)
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <layers> <enabled>true</enabled> </layers> </configuration> </plugin> </plugins> </build>
再用mvn package打包之后我們用命令分析下jar包內(nèi)容
java -Djarmode=layertools -jar target/dockers-demo-0.0.1-SNAPSHOT.jar list
這里就分別對(duì)應(yīng)了上述那四個(gè)部分代碼,所以如果只更改部分代碼的話并不需要再將依賴相關(guān)的代碼編譯上次編譯完的直接用唄。
FROM openjdk:8-jdk-alpine RUN mvn package ADD target/*.jar ./app.jar RUN java -Djarmode=layertools -jar app.jar extract FROM openjdk:8-jre WORKDIR application # 復(fù)制第三方依賴、SpringBoot內(nèi)部配置、快照依賴 COPY --from=builder application/dependencies/ ./ COPY --from=builder application/spring-boot-loader/ ./ COPY --from=builder application/snapshot-dependencies/ ./ COPY --from=builder application/application/ ./ ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
改造后你再去打包會(huì)發(fā)現(xiàn)特別快,springboot好用就在于內(nèi)置了很多依賴包,跨過依賴包單獨(dú)打業(yè)務(wù)代碼快的一批,但是僅在依賴版本未發(fā)生變更的場(chǎng)景下生效。
到此這篇關(guān)于springboot服務(wù)docker打包分層的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)springboot docker打包分層內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker啟動(dòng)rabbitmq以及使用方式詳解
RabbitMQ是一個(gè)由erlang開發(fā)的消息隊(duì)列,下面這篇文章主要給大家介紹了關(guān)于docker啟動(dòng)rabbitmq以及使用的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08docker容器中登陸并操作postgresql的實(shí)現(xiàn)
本文主要介紹了docker容器中登陸并操作postgresql的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02Docker 實(shí)現(xiàn)容器端口綁定本地端口
這篇文章主要介紹了Docker 實(shí)現(xiàn)容器端口綁定本地端口的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03docker安裝Elasticsearch7.6集群并設(shè)置密碼
這篇文章主要介紹了docker安裝Elasticsearch7.6集群并設(shè)置密碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06Docker Registry搭建私有鏡像倉(cāng)庫的實(shí)現(xiàn)方法
這篇文章主要介紹了Docker Registry搭建私有鏡像倉(cāng)庫的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10