日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

利用Spring Boot創(chuàng)建docker image的完整步驟

瀏覽:18日期:2023-04-29 17:30:09

前言

在很久很久以前,我們是怎么創(chuàng)建Spring Boot的docker image呢?最最通用的辦法就是將Spring boot的應(yīng)用程序打包成一個(gè)fat jar,然后寫一個(gè)docker file,將這個(gè)fat jar制作成為一個(gè)docker image然后運(yùn)行。

今天我們來體驗(yàn)一下Spring Boot 2.3.3 帶來的快速創(chuàng)建docker image的功能。

傳統(tǒng)做法和它的缺點(diǎn)

現(xiàn)在我們創(chuàng)建一個(gè)非常簡(jiǎn)單的Spring Boot程序:

@SpringBootApplication@RestControllerpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @GetMapping('/getInfo') public String getInfo() { return 'www.flydean.com'; }}

默認(rèn)情況下,我們build出來的是一個(gè)fat jar:springboot-with-docker-0.0.1-SNAPSHOT.jar

我們解壓看一下它的內(nèi)容:

利用Spring Boot創(chuàng)建docker image的完整步驟

Spring boot的fat jar分為三個(gè)部分,第一部分就是BOOT-INF, 里面的class目錄放的是我們自己編寫的class文件。而lib目錄存放的是項(xiàng)目依賴的其他jar包。

第二部分是META-INF,里面定義了jar包的屬性信息。

第三部分是Spring Boot的類加載器,fat jar包的啟動(dòng)是通過Spring Boot的jarLauncher來創(chuàng)建LaunchedURLClassLoader,通過它來加載lib下面的jar包,最后以一個(gè)新線程啟動(dòng)應(yīng)用的Main函數(shù)。

這里不多講Spring Boot的啟動(dòng)。

我們看一下,如果想要用這個(gè)fat jar來創(chuàng)建docker image應(yīng)該怎么寫:

FROM openjdk:8-jdk-alpineEXPOSE 8080ARG JAR_FILE=target/springboot-with-docker-0.0.1-SNAPSHOT.jarADD ${JAR_FILE} app.jarENTRYPOINT ['java','-jar','/app.jar']

這樣寫有兩個(gè)問題。

第一個(gè)問題:我們是用的far jar,在使用far jar的過程中會(huì)有一定的性能問題,肯定要比解壓過后的性能要低,尤其是在容器環(huán)境中運(yùn)行的情況下,可能會(huì)更加突出。

第二個(gè)問題:我們知道docker的image是按layer來構(gòu)建的,按layer構(gòu)建的好處就是可以減少image構(gòu)建的時(shí)間和重用之前的layer。

但是如果使用的是fat jar包,即使我們只修改了我們自己的代碼,也會(huì)導(dǎo)致整個(gè)fat jar重新更新,從而影響docker image的構(gòu)建速度。

使用Buildpacks

傳統(tǒng)的辦法除了有上面的兩個(gè)問題,還有一個(gè)就是需要自己構(gòu)建docker file,有沒有一鍵構(gòu)建docker image的方法呢?

答案是肯定的。

Spring Boot在2.3.0之后,引入了Cloud Native 的buildpacks,通過這個(gè)工具,我們可以非常非常方便的創(chuàng)建docker image。

在Maven和Gradle中,Spring Boot引入了新的phase: spring-boot:build-image

我們可以直接運(yùn)行:

mvn spring-boot:build-image

運(yùn)行之,很不幸的是,你可能會(huì)遇到下面的錯(cuò)誤:

[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.3.3.RELEASE:build-image (default-cli) on project springboot-with-docker: Execution default-cli of goal org.springframework.boot:spring-boot-maven-plugin:2.3.3.RELEASE:build-image failed: Docker API call to ’localhost/v1.24/images/create?fromImage=gcr.io%2Fpaketo-buildpacks%2Fbuilder%3Abase-platform-api-0.3’ failed with status code 500 'Internal Server Error' and message 'Get https://gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)' -> [Help 1]

這是因?yàn)槲覀儫o法從gcr.io中拉取鏡像!

沒關(guān)系,如果你會(huì)正確的上網(wǎng)方式的話,那么我估計(jì)你已經(jīng)找到了一個(gè)代理。

將你的代理配置到Docker的代理項(xiàng)里面,我使用的是Docker desktop,下面是我的配置:

利用Spring Boot創(chuàng)建docker image的完整步驟

重新運(yùn)行 mvn spring-boot:build-image

等待執(zhí)行結(jié)果:

[INFO] --- spring-boot-maven-plugin:2.3.3.RELEASE:build-image (default-cli) @ springboot-with-docker ---[INFO] Building image ’docker.io/library/springboot-with-docker:0.0.1-SNAPSHOT’[INFO] [INFO] > Pulling builder image ’gcr.io/paketo-buildpacks/builder:base-platform-api-0.3’ 0%[INFO] > Pulling builder image ’gcr.io/paketo-buildpacks/builder:base-platform-api-0.3’ 0%[INFO] > Pulling builder image ’gcr.io/paketo-buildpacks/builder:base-platform-api-0.3’ 0%[INFO] > Pulling builder image ’gcr.io/paketo-buildpacks/builder:base-platform-api-0.3’ 0%[INFO] > Pulling builder image ’gcr.io/paketo-buildpacks/builder:base-platform-api-0.3’ 0%[INFO] > Pulling builder image ’gcr.io/paketo-buildpacks/builder:base-platform-api-0.3’ 0%

你可以看到,我們的確是需要從gcr.io拉取image。

Layered Jars

如果你不想使用Cloud Native Buildpacks,還是想使用傳統(tǒng)的Dockerfile。 沒關(guān)系,SpringBoot為我們提供了獨(dú)特的分層jar包系統(tǒng)。

怎么開啟呢? 我們需要在POM文件中加上下面的配置:

<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <layers> <enabled>true</enabled> </layers> </configuration> </plugin> </plugins> </build>

再次打包,看下jar包的內(nèi)容:

利用Spring Boot創(chuàng)建docker image的完整步驟

看起來和之前的jar包沒什么不同,只不過多了一個(gè)layers.idx 這個(gè)index文件:

- 'dependencies': - 'BOOT-INF/lib/'- 'spring-boot-loader': - 'org/'- 'snapshot-dependencies':- 'application': - 'BOOT-INF/classes/' - 'BOOT-INF/classpath.idx' - 'BOOT-INF/layers.idx' - 'META-INF/'

index文件主要分為4個(gè)部分:

dependencies ? 非SNAPSHOT的依賴jar包 snapshot-dependencies ? SNAPSHOT的依賴jar包 spring-boot-loader ? Spring boot的class loader文件 application ? 應(yīng)用程序的class和resources文件

注意,這里的index文件是有順序的,它和我們將要添加到docker image中的layer順序是一致的。

最少變化的將會(huì)最先添加到layer中,變動(dòng)最大的放在最后面的layer。

我們可以使用layertools jarmode來對(duì)生成的fat jar進(jìn)行校驗(yàn)或者解壓縮:

java -Djarmode=layertools -jar springboot-with-docker-0.0.1-SNAPSHOT.jar Usage: java -Djarmode=layertools -jar springboot-with-docker-0.0.1-SNAPSHOT.jarAvailable commands: list List layers from the jar that can be extracted extract Extracts layers from the jar for image creation help Help about any command

使用list命令,我們可列出jar包中的layer信息。使用extract我們可以解壓出不同的layer。

我們執(zhí)行下extract命令,看下結(jié)果:

利用Spring Boot創(chuàng)建docker image的完整步驟

可以看到,我們根據(jù)layers.idx解壓出了不同的文件夾。

我們看一下使用layer的dockerFile應(yīng)該怎么寫:

FROM adoptopenjdk:11-jre-hotspot as builderWORKDIR applicationARG JAR_FILE=target/*.jarCOPY ${JAR_FILE} application.jarRUN java -Djarmode=layertools -jar application.jar extractFROM adoptopenjdk:11-jre-hotspotWORKDIR applicationCOPY --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']

這樣我們的一個(gè)分層的DockerImage就創(chuàng)建完成了。

自定義Layer

如果我們需要自定義Layer該怎么做呢?

我們可以創(chuàng)建一個(gè)獨(dú)立的layers.xml文件:

<layers xmlns='http://www.springframework.org/schema/boot/layers' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://www.springframework.org/schema/boot/layers https://www.springframework.org/schema/boot/layers/layers-2.3.xsd'> <application> <into layer='spring-boot-loader'> <include>org/springframework/boot/loader/**</include> </into> <into layer='application' /> </application> <dependencies> <into layer='snapshot-dependencies'> <include>*:*:*SNAPSHOT</include> </into> <into layer='company-dependencies'> <include>com.flydean:*</include> </into> <into layer='dependencies'/> </dependencies> <layerOrder> <layer>dependencies</layer> <layer>spring-boot-loader</layer> <layer>snapshot-dependencies</layer> <layer>company-dependencies</layer> <layer>application</layer> </layerOrder></layers>

怎么使用這個(gè)layer.xml呢?

添加到build plugin中就可以了:

<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <layers> <enabled>true</enabled> <configuration>${project.basedir}/src/main/resources/layers.xml</configuration> </layers> </configuration> </plugin> </plugins> </build>

本文的例子: springboot-with-docker

總結(jié)

到此這篇關(guān)于利用Spring Boot創(chuàng)建docker image完整步驟的文章就介紹到這了,更多相關(guān)Spring Boot創(chuàng)建docker image內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
天堂av在线| 国产欧美自拍一区| 久久精品三级| 国产极品嫩模在线观看91精品| 国产欧美88| 国产999精品在线观看| 色一区二区三区| 精品免费视频| 欧美天堂视频| 亚洲黄页一区| 青青草视频一区| 美女av在线免费看| av成人国产| 国产日韩欧美一区二区三区在线观看| 欧美1区二区| 中文字幕系列一区| 亚洲性视频在线| 久久99精品久久久野外观看| 国产福利片在线观看| 91精品99| 国产精品久久久久久妇女| 麻豆成全视频免费观看在线看| 成人看片网站| 综合一区av| 精品久久美女| 久久久精品五月天| 日韩一区网站| 亚洲免费福利| 日韩欧美中文字幕电影| 精品理论电影在线| 亚洲一区欧美二区| 久久一区欧美| 影音国产精品| 国产欧美高清| 欧美.日韩.国产.一区.二区 | 麻豆一区二区在线| 久久免费国产| 青青青国产精品| 高清久久一区| 中文一区一区三区免费在线观 | 成人羞羞视频播放网站| 蜜桃91丨九色丨蝌蚪91桃色 | 日本成人精品| 国产不卡av一区二区| 香蕉久久久久久久av网站| 国产欧美高清| 欧美色图国产精品| 日本综合视频| 亚洲韩日在线| 麻豆成人综合网| 亚洲日本国产| 婷婷成人基地| 岛国av在线网站| 日韩不卡手机在线v区| 国产综合婷婷| 国产一区二区三区91| 亚洲精品国产日韩| 日韩欧美一区二区三区在线观看 | 国产福利一区二区三区在线播放| 日韩一区二区在线免费| 中文字幕一区二区精品区| 亚洲伦乱视频| 国产精品久久久一区二区| 中文精品在线| 国产综合亚洲精品一区二| 中文字幕在线看片| 国产精品成人国产| 日本亚洲最大的色成网站www| 午夜日韩福利| 国产综合精品| 在线日韩视频| 首页国产精品| 精品三级在线观看视频| 国产精品免费不| 日本成人手机在线| 中文字幕日韩亚洲| 性欧美精品高清| 91久久中文| 婷婷综合亚洲| 激情国产在线| 欧美羞羞视频| 欧美成a人免费观看久久| 国产一区二区三区久久| 免费在线观看一区| 久久xxx视频| 免费亚洲婷婷| 国产无遮挡裸体免费久久| 日韩av一区二区三区四区| 日韩高清成人在线| 日韩av不卡一区二区| 亚洲精品日本| 日韩中文字幕在线一区| 亚洲精品亚洲人成在线观看| 丝袜诱惑制服诱惑色一区在线观看| 久久一区二区三区电影| 久久网站免费观看| 天堂资源在线亚洲| 欧美日韩激情在线一区二区三区| 国产字幕视频一区二区| 日韩一级精品| 亚洲美女91| 亚洲精品福利| 国产亚洲精品美女久久久久久久久久| 欧美亚洲三级| 国内精品美女在线观看| 免费高潮视频95在线观看网站| 色一区二区三区| 天堂资源在线亚洲| 免费一区二区视频| 日韩av在线播放中文字幕| 国产精品久久| 欧美xxxx中国| 午夜国产一区二区| 婷婷精品在线| 久久麻豆视频| 久久久久久久久丰满| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 久久青草久久| 免费视频国产一区| 亚洲精品激情| 久久精品国产福利| 久久久影院免费| 日韩激情精品| 日韩综合在线| 午夜在线精品偷拍| 国产精品欧美日韩一区| 亚洲精品国产嫩草在线观看| 爽好久久久欧美精品| 久久精品伊人| 91久久视频| 美女毛片一区二区三区四区最新中文字幕亚洲| 日韩欧美精品一区| 热久久国产精品| 国产一区二区三区不卡视频网站| 妖精视频成人观看www| 欧美日韩在线精品一区二区三区激情综合 | 日韩精品中文字幕吗一区二区| 国产精品一在线观看| 婷婷成人综合| 国产精选一区| 女同性一区二区三区人了人一| 国产亚洲精品美女久久| 群体交乱之放荡娇妻一区二区| 日韩影院精彩在线| 久久中文字幕一区二区三区| 亚洲精品午夜av福利久久蜜桃| 国产视频一区二区在线播放| 久久久噜噜噜| 国产欧美高清| 在线综合视频| 成人日韩av| 日韩精品亚洲专区在线观看| 国产伦久视频在线观看| 日韩中文字幕一区二区高清99| 日韩欧美精品| 国产欧美日韩一级| av不卡在线看| 成人在线视频免费看| 美女久久网站| 免费福利视频一区二区三区| 亚洲欧美日本国产| 亚洲成人精品| 另类综合日韩欧美亚洲| 亚洲精品国模| 蜜臀av免费一区二区三区| 欧美激情在线精品一区二区三区| 免费国产自线拍一欧美视频| caoporn视频在线| 国产欧美三级| 亚洲精品自拍| 丝袜亚洲另类欧美| 国内亚洲精品| 日韩欧美精品一区| 荡女精品导航| 91精品一区| 亚洲人妖在线| 亚洲欧美日本日韩| 久久视频精品| 韩国精品主播一区二区在线观看| 国产精品一区免费在线| 在线看片日韩| 亚洲精品小说| 久久天堂精品| 成人午夜网址| 久久亚洲道色| 国产精久久久| 欧美伊人影院| 日韩和欧美的一区| 首页国产欧美久久| 成人午夜国产| 日本在线精品| 亚洲性色av| 日韩欧美三级| se01亚洲视频| 999精品一区| 91精品一区二区三区综合在线爱| 欧美男人天堂| av高清不卡| 日韩精品一区二区三区免费观影| 久久精品毛片|