最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年08月30日 08:40:54   作者:程序那些事  
這篇文章主要給大家介紹了關(guān)于如何利用Spring Boot創(chuàng)建docker image的完整步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

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

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

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

@SpringBootApplication
@RestController
public 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出來(lái)的是一個(gè)fat jar:springboot-with-docker-0.0.1-SNAPSHOT.jar

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

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

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

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

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

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

FROM openjdk:8-jdk-alpine
EXPOSE 8080
ARG JAR_FILE=target/springboot-with-docker-0.0.1-SNAPSHOT.jar
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

這樣寫(xiě)有兩個(gè)問(wèn)題。

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

第二個(gè)問(wèn)題:我們知道docker的image是按layer來(lái)構(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è)問(wèn)題,還有一個(gè)就是需要自己構(gòu)建docker file,有沒(méi)有一鍵構(gòu)建docker image的方法呢?

答案是肯定的。

Spring Boot在2.3.0之后,引入了Cloud Native 的buildpacks,通過(guò)這個(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(wú)法從gcr.io中拉取鏡像!

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

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

重新運(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。 沒(méi)關(guān)系,SpringBoot為我們提供了獨(dú)特的分層jar包系統(tǒng)。

怎么開(kāi)啟呢? 我們需要在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)容:

看起來(lái)和之前的jar包沒(méi)什么不同,只不過(guò)多了一個(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來(lái)對(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.jar

Available 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é)果:

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

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

FROM adoptopenjdk:11-jre-hotspot as builder
WORKDIR application
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract

FROM adoptopenjdk:11-jre-hotspot
WORKDIR application
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"]

這樣我們的一個(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)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot基于Redis實(shí)現(xiàn)短信登錄的操作

    SpringBoot基于Redis實(shí)現(xiàn)短信登錄的操作

    驗(yàn)證碼登錄是非常常見(jiàn)的一種登錄方式,能夠簡(jiǎn)化用戶登錄的過(guò)程,本文主要介紹了SpringBoot基于Redis實(shí)現(xiàn)短信登錄的操作,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • Java Web實(shí)現(xiàn)session過(guò)期后自動(dòng)跳轉(zhuǎn)到登陸頁(yè)功能【基于過(guò)濾器】

    Java Web實(shí)現(xiàn)session過(guò)期后自動(dòng)跳轉(zhuǎn)到登陸頁(yè)功能【基于過(guò)濾器】

    這篇文章主要介紹了Java Web實(shí)現(xiàn)session過(guò)期后自動(dòng)跳轉(zhuǎn)到登陸頁(yè)功能,涉及java過(guò)濾器針對(duì)session的判斷與跳轉(zhuǎn)相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11
  • Java的Shiro框架認(rèn)證流程詳解

    Java的Shiro框架認(rèn)證流程詳解

    這篇文章主要介紹了Java的Shiro框架認(rèn)證流程詳解,Shiro 是一個(gè)功能強(qiáng)大和易于使用的安全框架,為開(kāi)發(fā)人員提供一個(gè)直觀而全面的解決方案的認(rèn)證,授權(quán),加密,會(huì)話管理四大功能,需要的朋友可以參考下
    2024-01-01
  • Spring Security學(xué)習(xí)之rememberMe自動(dòng)登錄的實(shí)現(xiàn)

    Spring Security學(xué)習(xí)之rememberMe自動(dòng)登錄的實(shí)現(xiàn)

    這篇文章主要給大家介紹了關(guān)于Spring Security學(xué)習(xí)之rememberMe自動(dòng)登錄的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • springboot寶塔簡(jiǎn)單部署的實(shí)現(xiàn)示例

    springboot寶塔簡(jiǎn)單部署的實(shí)現(xiàn)示例

    通過(guò)使用Spring Boot,可以快速構(gòu)建出高效、可擴(kuò)展的應(yīng)用程序,而寶塔面板則提供了簡(jiǎn)單易用的網(wǎng)站管理和維護(hù)工具,本文將詳細(xì)介紹如何將Spring Boot應(yīng)用程序與寶塔面板進(jìn)行集成,實(shí)現(xiàn)自動(dòng)化部署、配置管理等操作
    2023-11-11
  • 詳解mybatis foreach collection示例

    詳解mybatis foreach collection示例

    這篇文章主要介紹了詳解mybatis foreach collection的相關(guān)資料,需要的朋友可以參考下
    2017-10-10
  • Mybatis傳參為逗號(hào)分隔的字符串情形進(jìn)行in條件查詢方式

    Mybatis傳參為逗號(hào)分隔的字符串情形進(jìn)行in條件查詢方式

    這篇文章主要介紹了Mybatis傳參為逗號(hào)分隔的字符串情形進(jìn)行in條件查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • springboot配置文件的加載順序解析

    springboot配置文件的加載順序解析

    這篇文章主要介紹了springboot配置文件的加載順序解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • springAop實(shí)現(xiàn)講解(看這篇夠了)

    springAop實(shí)現(xiàn)講解(看這篇夠了)

    AOP面向切面編程是一種編程范式,它通過(guò)將通用的橫切關(guān)注點(diǎn)(如日志、事務(wù)、權(quán)限控制等)與業(yè)務(wù)邏輯分離,使得代碼更加清晰、簡(jiǎn)潔、易于維護(hù),這篇文章主要介紹了springAop實(shí)現(xiàn)講解(看這篇夠了),需要的朋友可以參考下
    2024-02-02
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(2)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(2)

    下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你
    2021-07-07

最新評(píng)論

铜鼓县| 郴州市| 青岛市| 澳门| 家居| 贵州省| 肥东县| 成都市| 屏边| 武穴市| 博乐市| 承德县| 醴陵市| 五家渠市| 宣化县| 福安市| 乐昌市| 德兴市| 临清市| 长治市| 柳江县| 泰宁县| 顺昌县| 东台市| 报价| 托克托县| 舟山市| 金堂县| 垣曲县| 比如县| 来宾市| 宜阳县| 松阳县| 礼泉县| 丰顺县| 如东县| 株洲县| 多伦县| 图们市| 墨脱县| 桃园市|