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

您的位置:首頁技術文章
文章詳情頁

利用Spring Boot創建docker image的完整步驟

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

前言

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

今天我們來體驗一下Spring Boot 2.3.3 帶來的快速創建docker image的功能。

傳統做法和它的缺點

現在我們創建一個非常簡單的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'; }}

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

我們解壓看一下它的內容:

利用Spring Boot創建docker image的完整步驟

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

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

第三部分是Spring Boot的類加載器,fat jar包的啟動是通過Spring Boot的jarLauncher來創建LaunchedURLClassLoader,通過它來加載lib下面的jar包,最后以一個新線程啟動應用的Main函數。

這里不多講Spring Boot的啟動。

我們看一下,如果想要用這個fat jar來創建docker image應該怎么寫:

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']

這樣寫有兩個問題。

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

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

但是如果使用的是fat jar包,即使我們只修改了我們自己的代碼,也會導致整個fat jar重新更新,從而影響docker image的構建速度。

使用Buildpacks

傳統的辦法除了有上面的兩個問題,還有一個就是需要自己構建docker file,有沒有一鍵構建docker image的方法呢?

答案是肯定的。

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

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

我們可以直接運行:

mvn spring-boot:build-image

運行之,很不幸的是,你可能會遇到下面的錯誤:

[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]

這是因為我們無法從gcr.io中拉取鏡像!

沒關系,如果你會正確的上網方式的話,那么我估計你已經找到了一個代理。

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

利用Spring Boot創建docker image的完整步驟

重新運行 mvn spring-boot:build-image

等待執行結果:

[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,還是想使用傳統的Dockerfile。 沒關系,SpringBoot為我們提供了獨特的分層jar包系統。

怎么開啟呢? 我們需要在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包的內容:

利用Spring Boot創建docker image的完整步驟

看起來和之前的jar包沒什么不同,只不過多了一個layers.idx 這個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個部分:

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

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

最少變化的將會最先添加到layer中,變動最大的放在最后面的layer。

我們可以使用layertools jarmode來對生成的fat jar進行校驗或者解壓縮:

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。

我們執行下extract命令,看下結果:

利用Spring Boot創建docker image的完整步驟

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

我們看一下使用layer的dockerFile應該怎么寫:

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']

這樣我們的一個分層的DockerImage就創建完成了。

自定義Layer

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

我們可以創建一個獨立的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>

怎么使用這個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

總結

到此這篇關于利用Spring Boot創建docker image完整步驟的文章就介紹到這了,更多相關Spring Boot創建docker image內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
天堂精品久久久久| 国产精品丝袜在线播放| 99久久99久久精品国产片果冰| 老牛国产精品一区的观看方式| 岛国av免费在线观看| 亚洲一区二区三区高清| 国产精品视频一区二区三区| 亚洲视频www| 久久夜夜操妹子| 麻豆精品av| 亚洲精品2区| 丝袜美腿诱惑一区二区三区 | 最新国产精品久久久| 好看的av在线不卡观看| 精精国产xxxx视频在线野外| 国产成人精品一区二区三区在线| 国产精品久久久久久久免费软件 | 日韩一区二区三区高清在线观看| 老司机精品久久| 国产农村妇女精品一二区| 99久久久久| 日韩一级网站| 中文字幕一区二区精品区| 久久影视一区| 9国产精品视频| 亚洲综合色婷婷在线观看| 日本一区二区三区视频在线看| 综合色一区二区| 久久国产免费看| 精品一区二区三区中文字幕视频| 国产精品三p一区二区| 久久精品99久久无色码中文字幕| 婷婷国产精品| 91久久午夜| 欧美一区不卡| 91综合网人人| 老司机精品久久| 欧美专区一区| 日韩免费久久| 免费看精品久久片| 美日韩一区二区三区| 欧美精品资源| 日韩伦理一区| 欧美日韩国产精品一区二区亚洲| 久久性天堂网| 国产精品久久久久久久久久10秀| 福利在线免费视频| 欧美午夜不卡| 久久久久97| 亚洲欧美高清| 麻豆成人91精品二区三区| 亚洲成人精品| 国产日产一区| 欧美日韩国产在线一区| 欧美黄页在线免费观看| 亚洲激情黄色| 激情久久一区二区| 久久亚洲成人| 国产精品草草| 国产超碰精品| 久久一二三区| 国产不卡精品在线| 日韩精品一区二区三区中文在线 | 性欧美长视频| 久久久成人网| 久久精品国产999大香线蕉| 在线精品亚洲| 一区三区视频| 婷婷激情图片久久| 日韩电影免费在线观看| 国产精品视频一区二区三区综合| 国产亚洲毛片在线| 亚洲高清久久| 1000部精品久久久久久久久| 国产精品videosex极品| 青青国产91久久久久久| 伊人久久一区| 日韩影院免费视频| 免费日韩视频| 亚洲丝袜美腿一区| 国产欧美一区二区三区国产幕精品| 91精品二区| 99在线精品免费视频九九视 | 五月婷婷六月综合| 一区二区亚洲视频| 久久av一区| 国产精品极品国产中出| 群体交乱之放荡娇妻一区二区| 国产精品美女久久久| 国产区精品区| 欧美aa一级| 亚洲精品乱码久久久久久蜜桃麻豆| 亚欧洲精品视频在线观看| 欧美a级一区二区| 五月天久久777| 免费一级欧美片在线观看网站| 国产尤物精品| 欧美国产极品| 一区二区亚洲视频| 久久久久中文| 国产伦理久久久久久妇女| 久久久777| 国产精品videossex久久发布| 黑丝一区二区三区| 国产精选在线| 日本不良网站在线观看| 婷婷亚洲综合| 国产精品一国产精品| 日本精品国产| 国产日产一区| 奇米狠狠一区二区三区| 成人在线丰满少妇av| 国产不卡人人| 亚洲午夜91| 国产一区成人| 蜜臀久久99精品久久久画质超高清| 日韩视频一区| 国产亚洲一区| 动漫av一区| 亚洲经典在线| 国产欧美久久一区二区三区| 久久99性xxx老妇胖精品| 黄在线观看免费网站ktv| 亚洲调教视频在线观看| 亚洲免费毛片| 伊伊综合在线| 亚洲丝袜啪啪| 韩国久久久久久| 三级欧美在线一区| 美腿丝袜在线亚洲一区| 欧美天堂视频| 日韩欧美美女在线观看| 精品国产欧美| 一级成人国产| 欧美少妇精品| 国产美女精品视频免费播放软件| 亚洲爱爱视频| 久久av偷拍| 日本少妇一区二区| 韩国三级一区| 亚洲二区三区不卡| 激情中国色综合| 人人精品亚洲| 麻豆精品网站| 国产精品最新自拍| 九九九精品视频| 成人欧美一区二区三区的电影| 米奇777超碰欧美日韩亚洲| 亚洲欧美日韩国产综合精品二区| 国产欧美一区二区精品久久久| av日韩中文| 亚洲尤物av| 日韩在线观看一区| 欧美一区=区三区| 欧美日韩一区二区三区视频播放| 四虎精品永久免费| 精品成av人一区二区三区 | 国产精品久久久久久久久久白浆| 欧美午夜三级| 丰满少妇一区| 亚洲免费观看| 国产精品一区二区av日韩在线| 国内精品麻豆美女在线播放视频| 中文在线中文资源| 日韩av一区二区三区四区| 日韩成人综合| 国产日韩免费| 亚洲婷婷丁香| 成人久久久久| 麻豆91小视频| 日韩综合一区二区| 亚洲国产专区| 麻豆精品99| 热久久久久久| 免费中文字幕日韩欧美| 国产videos久久| 欧美在线黄色| 国产另类在线| 国产精品专区免费| 亚洲性色视频| 欧美aa在线视频| 午夜国产精品视频免费体验区| 欧美日本久久| 精品网站999| 久久精品国产久精国产爱| 久久国产免费| 精品女同一区二区三区在线观看| 一本综合精品| 亚洲91在线| 亚洲二区在线| 国产精品白丝久久av网站| 国产精品xxx| 日韩精品欧美大片| 日韩精品亚洲专区| 亚洲精品人人| 日韩激情视频网站| 国产精品成人国产| 美女性感视频久久| 久久久久免费| 午夜久久久久|