一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

云服務器|WEB服務器|FTP服務器|郵件服務器|虛擬主機|服務器安全|DNS服務器|服務器知識|Nginx|IIS|Tomcat|

服務器之家 - 服務器技術 - 服務器知識 - Spring Boot 分層打包 Docker 鏡像實踐及分析(推薦)

Spring Boot 分層打包 Docker 鏡像實踐及分析(推薦)

2022-01-19 16:16C_BC 服務器知識

這篇文章主要介紹了Spring Boot 分層打包 Docker 鏡像實踐及分析,本文通過圖文并茂的形式實例代碼相結合給大家介紹的非常詳細,需要的朋友可以參考下

1. 準備 spring boot 項目

簡單,略過
spring boot 版本 > 2.3.x 即可
簡單寫了一個 hello world

Spring Boot 分層打包 Docker 鏡像實踐及分析(推薦)

2. 進行相關配置

這里網上很多 blog 都強調了要去 pom.xml 里手動配置啟用分層打包:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <!--開啟分層編譯支持-->
                <layers>
                    <enabled>true</enabled>
                </layers>
            </configuration>
        </plugin>
    </plugins>
</build>

2.3.x版本的時候因為是新功能需要手動配置開啟。但是目前 spring boot 版本(使用版本2.6.1)實測不需要手動配置,默認支持該特性。(根據一些 blog 的說法是 2.4.x 版本之后就默認開啟了)

目前的官方文檔(2.6.0版本)的說法也是默認支持,反而不需要該特性時才需要手動配置:

The repackaged archive includes the layers.idx file by default. To disable this feature, you can do so in the following manner:

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

3. package

執行 mvn package 進行打包,得到 jar 包文件。

Spring Boot 分層打包 Docker 鏡像實踐及分析(推薦)

其實實際上本質是使用了 spring-boot-maven 插件的 repackage,得到了完整的包含依賴的 jar 包和原始的 jar 包(自動添加后綴 .original)
打開 jar 包,會發現在 BOOT-INF 文件夾下有 classpath.idxlayers.idx 文件,打開看下:

classpath.idx

- "BOOT-INF/lib/logback-classic-1.2.7.jar"

- "BOOT-INF/lib/logback-core-1.2.7.jar"

- "BOOT-INF/lib/log4j-to-slf4j-2.14.1.jar"

- "BOOT-INF/lib/log4j-api-2.14.1.jar"

- "BOOT-INF/lib/jul-to-slf4j-1.7.32.jar"

- "BOOT-INF/lib/jakarta.annotation-api-1.3.5.jar"

- "BOOT-INF/lib/snakeyaml-1.29.jar"

- "BOOT-INF/lib/jackson-databind-2.13.0.jar"

- "BOOT-INF/lib/jackson-annotations-2.13.0.jar"

- "BOOT-INF/lib/jackson-core-2.13.0.jar"

- "BOOT-INF/lib/jackson-datatype-jdk8-2.13.0.jar"

- "BOOT-INF/lib/jackson-datatype-jsr310-2.13.0.jar"

- "BOOT-INF/lib/jackson-module-parameter-names-2.13.0.jar"

- "BOOT-INF/lib/tomcat-embed-core-9.0.55.jar"

- "BOOT-INF/lib/tomcat-embed-el-9.0.55.jar"

- "BOOT-INF/lib/tomcat-embed-websocket-9.0.55.jar"

- "BOOT-INF/lib/spring-web-5.3.13.jar"

- "BOOT-INF/lib/spring-beans-5.3.13.jar"

- "BOOT-INF/lib/spring-webmvc-5.3.13.jar"

- "BOOT-INF/lib/spring-aop-5.3.13.jar"

- "BOOT-INF/lib/spring-context-5.3.13.jar"

- "BOOT-INF/lib/spring-expression-5.3.13.jar"

- "BOOT-INF/lib/spring-boot-2.6.1.jar"

- "BOOT-INF/lib/spring-boot-autoconfigure-2.6.1.jar"

- "BOOT-INF/lib/slf4j-api-1.7.32.jar"

- "BOOT-INF/lib/spring-core-5.3.13.jar"

- "BOOT-INF/lib/spring-jcl-5.3.13.jar"

 

- "BOOT-INF/lib/spring-boot-jarmode-layertools-2.6.1.jar"

 

layers.idx

- "dependencies":

  - "BOOT-INF/lib/"

- "spring-boot-loader":

  - "org/"

- "snapshot-dependencies":

- "application":

  - "BOOT-INF/classes/"

  - "BOOT-INF/classpath.idx"

  - "BOOT-INF/layers.idx"

 

  - "META-INF/"

再驗證一下:

Spring Boot 分層打包 Docker 鏡像實踐及分析(推薦)

分層信息 ok

4. Dockerfile

Dockerfile 文件也相對常規,只是在打包鏡像之前使用 jarmode 命令把 jar 包解壓了,然后在打包鏡像過程中將不同層依次 COPY,將改動可能性最大的應用層放在最后,這樣前面的沒有變化就可以直接使用 Docker 的緩存以提高打包效率。

FROM eclipse-temurin:8-jre-focal as builder  

WORKDIR application  

ARG JAR_FILE=target/*.jar  

COPY ${JAR_FILE} application.jar  

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

FROM eclipse-temurin:8-jre-focal  

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/ ./  

ENV TZ="Asia/Shanghai"  

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone  

ENV JVM_OPTS=""  

ENV JAVA_OPTS=""  

ENTRYPOINT ["sh","-c","java $JVM_OPTS $JAVA_OPTS org.springframework.boot.loader.JarLauncher"]

5. 應用程序修改&dive分析

其實如果只打包一次鏡像是沒有體現分層的優勢的,所以需要修改部分內容后再打包一次(或者多次,但是本質是一樣的所以這里只修改了一次)
修改部分應用代碼:

Spring Boot 分層打包 Docker 鏡像實踐及分析(推薦)

重新打 jar 包&重新打鏡像,這樣得到了兩個鏡像:

Spring Boot 分層打包 Docker 鏡像實踐及分析(推薦)

使用 dive 對兩個鏡像進行分析:

Spring Boot 分層打包 Docker 鏡像實踐及分析(推薦)

Spring Boot 分層打包 Docker 鏡像實踐及分析(推薦)

Spring Boot 分層打包 Docker 鏡像實踐及分析(推薦)

可以發現:直到發生改變的應用層(application/application/)之前,兩邊的分層的 Id、Digest 都是完全一致的,所以這些層是可以復用的,相同的層只會在 docker 的目錄下存儲單個,如此可以大大減少容器編譯、推送的時長。
(具體 docker 鏡像的分層的了解還有限,后續再進一步了解)

到此這篇關于Spring Boot 分層打包 Docker 鏡像實踐及分析的文章就介紹到這了,更多相關Spring Boot 分層打包 Docker 鏡像內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/cbc-onne/archive/2021/12/09/15669577.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 四虎永久免费在线观看 | 欧美一级视频在线高清观看 | 成人欧美一区二区三区白人 | 操bb视频 | а天堂中文最新版在线官网视频 | 亚洲 欧美 国产 日韩 字幕 | 欧美一卡2卡3卡四卡海外精品 | 特黄特色一级aa毛片免费观看 | 免费网站视频 | 热99精品在线 | 逼中极品| 91啦在线播放 | 性色欲情网站IWWW九文堂 | 肉色欧美久久久久久久蜜桃 | 美女脱了内裤打开腿让人桶网站o | jazz欧美人免费xxxxxx | www.4虎影院 w7w7w7w7w免费 | jzzjlzz亚洲乱熟在线播放 | 精品久久久麻豆国产精品 | 性派对videofreeparty | 热穴高校 | 亚洲视频免费在线看 | 脱女学小内内摸出水网站免费 | 午夜影院0606 | 亚洲 日本 中文字幕 制服 | 极品主播的慰在线播放 | 国产精品女主播自在线拍 | 国产精品国语自产拍在线观看 | 国产激情在线 | 国产香蕉一区二区在线观看 | 精品一区二区三区中文 | 啪啪大幂幂被c | 大香线一本 | 亚洲精品一二三四 | 亚洲欧洲日产国码 最新 | 99国产自偷色久 | 毛片视频在线免费观看 | 免费一级夫妻a | 91热国内精品永久免费观看 | 亚洲伦理天堂 | 人人干国产 |