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

SpringBoot項目docker分層鏡像構建案例

 更新時間:2026年02月10日 09:18:02   作者:昵稱為空C  
本文主要介紹Spring Boot項目的docker鏡像分層構建,通過將外部依賴、內部依賴和應用程序代碼分離,可以利用Docker的緩存機制,加快構建速度和測試環(huán)境鏡像拉取速度,感興趣的可以了解一下

摘要:本文主要介紹Spring Boot項目的docker鏡像分層構建,分為外部依賴和內部依賴和項目classes依賴,讓docker構建的時候,可以使用之前的緩存,加快構建速度和測試環(huán)境鏡像拉取速度。

為什么使用分層 Docker 鏡像?

傳統(tǒng)的 Docker 鏡像構建方式會將整個應用程序 JAR/WAR 文件復制到一個層中。當你修改代碼時,整個層都會失效,導致 Docker 必須重新構建整個應用程序層,即使只是做了微小的代碼更改。

通過我們的分層方法,我們將以下內容分離:

  1. 外部依賴(第三方庫)
  2. 內部依賴(公司特定庫)
  3. 應用程序代碼(實際業(yè)務邏輯)

這樣,當你修改代碼時,只需要重新構建應用程序代碼層,而依賴層可以從緩存中重用。

Maven 插件配置詳解

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-dependency-plugin</artifactId>
      <executions>
        <execution>
          <id>copy-external-dependencies</id>
          <phase>package</phase>
          <goals>
            <goal>copy-dependencies</goal>
          </goals>
          <configuration>
            <outputDirectory>${project.build.directory}/lib/external</outputDirectory>
            <includeScope>compile</includeScope>
            <excludeGroupIds>cn.hutool</excludeGroupIds>
          </configuration>
        </execution>

        <execution>
          <id>copy-internal-dependencies</id>
          <phase>package</phase>
          <goals>
            <goal>copy-dependencies</goal>
          </goals>
          <configuration>
            <outputDirectory>${project.build.directory}/lib/internal</outputDirectory>
            <includeScope>compile</includeScope>
            <includeGroupIds>cn.hutool</includeGroupIds>
          </configuration>
        </execution>
      </executions>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <configuration>
        <source>21</source>
        <target>21</target>
        <encoding>UTF-8</encoding>
        <!-- 如果使用預覽特性 -->
        <compilerArgs>
          <arg>--enable-preview</arg>
        </compilerArgs>
        <release>21</release>
      </configuration>
    </plugin>
  </plugins>
</build>

工作原理

1. Maven 依賴分離插件配置詳解

我們的 pom.xml 使用 maven-dependency-plugin 在構建過程中分離依賴。該插件包含兩個執(zhí)行配置:

外部依賴復制配置

<execution>
    <id>copy-external-dependencies</id>
    <phase>package</phase>
    <goals>
        <goal>copy-dependencies</goal>
    </goals>
    <configuration>
        <outputDirectory>${project.build.directory}/lib/external</outputDirectory>
        <includeScope>compile</includeScope>
        <excludeGroupIds>cn.hutool</excludeGroupIds>
    </configuration>
</execution>

配置參數(shù)說明:

<id>: 執(zhí)行的唯一標識符

<phase>: 綁定到 Maven 生命周期的 package 階段

<goals>: 執(zhí)行的目標是 copy-dependencies

<configuration>: 配置詳情

  • <outputDirectory>: 輸出目錄,${project.build.directory} 是 target 目錄
  • <includeScope>: 包含作用域為 compile 的依賴
  • <excludeGroupIds>: 排除 groupId 為 cn.hutool 的依賴(將其視為內部依賴)

內部依賴復制配置

<execution>
    <id>copy-internal-dependencies</id>
    <phase>package</phase>
    <goals>
        <goal>copy-dependencies</goal>
    </goals>
    <configuration>
        <outputDirectory>${project.build.directory}/lib/internal</outputDirectory>
        <includeScope>compile</includeScope>
        <includeGroupIds>cn.hutool</includeGroupIds>
    </configuration>
</execution>

配置參數(shù)說明:

<id>: 執(zhí)行的唯一標識符

<phase>: 同樣綁定到 Maven 生命周期的 package 階段

<goals>: 執(zhí)行的目標也是 copy-dependencies

<configuration>: 配置詳情

  • <outputDirectory>: 輸出目錄為 target/lib/internal
  • <includeScope>: 包含作用域為 compile 的依賴
  • <includeGroupIds>: 只包含 groupId 為 cn.hutool 的依賴(作為內部依賴處理)

通過這兩個執(zhí)行配置,Maven 會在 package 階段自動將依賴分別復制到對應的目錄中:

  • target/lib/external/ - 第三方依賴(排除了 cn.hutool)
  • target/lib/internal/ - 內部/公司特定依賴(只有 cn.hutool)
  • target/classes/ - 編譯后的應用程序代碼

2. 分層 Dockerfile 詳解

我們的 Dockerfile 通過首先復制依賴來利用 Docker 層緩存:

FROM eclipse-temurin:21-jre-alpine
WORKDIR /app

# 1. 復制外部依賴(很少更改)
COPY target/lib/external/*.jar ./lib/external/

# 2. 復制內部依賴(偶爾更改)
COPY target/lib/internal/*.jar ./lib/internal/

# 3. 復制應用程序類(經常更改)
COPY target/classes ./classes

EXPOSE 8080

ENV CUSTOM_OPTS="-Xms256m -Xmx768m"
ENV JAVA_OPTS="--enable-preview -XX:+UseSerialGC"
ENTRYPOINT ["sh", "-c", "java $CUSTOM_OPTS $JAVA_OPTS -cp /app/classes:/app/lib/external/*:/app/lib/internal/* com.example.layer.Sp3LayerApplication"]

Dockerfile 配置說明:

FROM eclipse-temurin:21-jre-alpine: 使用輕量級的 Alpine Linux 上的 Temurin JDK 21 運行時環(huán)境

WORKDIR /app: 設置工作目錄為 /app

COPY target/lib/external/*.jar ./lib/external/: 將外部依賴復制到鏡像中,這是最穩(wěn)定的層

COPY target/lib/internal/*.jar ./lib/internal/: 將內部依賴復制到鏡像中,這層比外部依賴更可能變化

COPY target/classes ./classes: 將應用程序類文件復制到鏡像中,這層最容易發(fā)生變化

EXPOSE 8080: 暴露應用程序端口

ENV 指令設置 JVM 參數(shù):

  • CUSTOM_OPTS: 自定義 JVM 參數(shù),設置初始堆內存和最大堆內存
  • JAVA_OPTS: Java 虛擬機選項,啟用預覽特性和使用串行垃圾收集器

ENTRYPOINT: 定義容器啟動時執(zhí)行的命令,使用類路徑包含所有依賴和應用程序類

類路徑說明:
-cp /app/classes:/app/lib/external/*:/app/lib/internal/* 指定了類路徑的順序:

  1. /app/classes: 應用程序編譯后的類文件優(yōu)先級最高
  2. /app/lib/external/*: 外部依賴次之
  3. /app/lib/internal/*: 內部依賴最后

這種順序確保了應用程序類可以覆蓋依賴中的同名類(如果需要的話),并且保證了正確的類加載順序。

3. 構建過程詳解

Maven 構建生命周期集成

當執(zhí)行 mvn package 命令時,Maven 會按照以下順序執(zhí)行構建階段:

  1. validate - 驗證項目正確性
  2. compile - 編譯源代碼
  3. test - 運行測試
  4. package - 打包應用程序

在 package 階段,maven-dependency-plugin 會自動執(zhí)行我們配置的兩個依賴復制任務:

  1. 首先執(zhí)行 copy-external-dependencies,將外部依賴復制到 target/lib/external/
  2. 然后執(zhí)行 copy-internal-dependencies,將內部依賴復制到 target/lib/internal/
  3. 同時,Maven 默認會將編譯后的類文件放在 target/classes/ 目錄中

完整構建步驟

清理并打包應用程序:

mvn clean package

此命令會觸發(fā)依賴分離過程,生成三個目錄:

  • target/classes/ - 應用程序編譯后的類文件
  • target/lib/external/ - 外部依賴 JAR 文件
  • target/lib/internal/ - 內部依賴 JAR 文件
  1. 構建 Docker 鏡像:
docker build -t sp3-layer .

Docker 構建過程會按順序創(chuàng)建四個層:

  • 基礎鏡像層(eclipse-temurin:21-jre-alpine)
  • 外部依賴層(COPY target/lib/external/*.jar)
  • 內部依賴層(COPY target/lib/internal/*.jar)
  • 應用程序類層(COPY target/classes)

構建優(yōu)化效果

由于 Docker 的層緩存機制:

  • 當只修改應用程序代碼時,只有最后一層需要重建
  • 當添加新的外部依賴時,需要重建外部依賴層及其后的所有層
  • 當添加新的內部依賴時,需要重建內部依賴層和應用程序類層
  • 只有基礎鏡像變更時,才需要完全重建

優(yōu)勢

  1. 更快的構建速度:代碼更改時只需重新構建應用程序代碼層
  2. 更小的傳輸量:推送到注冊中心時,只傳輸更改的層
  3. 更好的緩存效果:依賴層在各個構建之間緩存并重用
  4. 減少帶寬消耗:在 CI/CD 流水線中減少數(shù)據(jù)傳輸

版本更新工作流程

  1. 在應用程序中進行代碼更改
  2. 運行 mvn clean package 僅重新編譯更改的代碼
  3. 運行 docker build -t sp3-layer:v2 . 構建新鏡像
  4. 只有 target/classes 層會被重新構建
  5. 只將更改的層推送到容器注冊中心

配置自定義指南

要將此配置應用于其他項目,您需要根據(jù)項目的依賴結構調整配置:

修改依賴分組

如果您有不同的內部依賴,需要修改 excludeGroupIdsincludeGroupIds 配置:

<!-- 外部依賴配置 -->
<excludeGroupIds>com.yourcompany,org.another.internal.group</excludeGroupIds>
<!-- 內部依賴配置 -->
<includeGroupIds>com.yourcompany,org.another.internal.group</includeGroupIds>

最佳實踐

  1. 順序很重要:首先復制不經常更改的層
  2. 最小化層數(shù):只分離實際在不同頻率下更改的內容
  3. 多階段構建:考慮與多階段構建結合使用以獲得更小的最終鏡像
  4. 緩存失效:了解 Docker 的層緩存機制以最大化收益

這種方法可以顯著減少 CI/CD 流水線中的構建時間,并在部署更新時最小化網絡傳輸。

到此這篇關于SpringBoot項目docker分層鏡像構建案例的文章就介紹到這了,更多相關SpringBoot docker分層鏡像 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 基于params、@PathVariabl和@RequestParam的用法與區(qū)別說明

    基于params、@PathVariabl和@RequestParam的用法與區(qū)別說明

    這篇文章主要介紹了方法參數(shù)相關屬性params、@PathVariabl和@RequestParam用法與區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • MyBatis注解實現(xiàn)動態(tài)SQL問題

    MyBatis注解實現(xiàn)動態(tài)SQL問題

    這篇文章主要介紹了MyBatis注解實現(xiàn)動態(tài)SQL問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • IntelliJ IDEA cmd和idea Terminal查看java版本不一致的解決方案

    IntelliJ IDEA cmd和idea Terminal查看java版本不一致的解決

    原來win10電腦上安裝的是jdk8的版本,因某些原因,現(xiàn)在想換成jdk7的版本,修改環(huán)境變量后,在cmd中執(zhí)行 [java -version]命令,顯示的是7的版本,遇到這樣的問題如何解決呢?下面小編給大家分享IntelliJ IDEA cmd和idea Terminal查看java版本不一致的解決方案,一起看看吧
    2023-09-09
  • springboot如何獲取yaml/yml(或properties)配置文件信息

    springboot如何獲取yaml/yml(或properties)配置文件信息

    在SpringBoot項目中,讀取配置文件信息是常見需求,可以通過@Autowired注入Environment類,使用@Value注解直接注入配置信息,或定義工具類結合ApplicationRunner進行高級配置信息獲取,特別提到
    2024-11-11
  • Springboot?中使用Sentinel的詳細步驟

    Springboot?中使用Sentinel的詳細步驟

    文章介紹了如何在SpringBoot中使用Sentinel進行限流和熔斷降級,首先添加依賴,配置Sentinel控制臺地址,定義受保護的資源,配置流控規(guī)則,啟動Sentinel控制臺和SpringBoot應用,最后測試和監(jiān)控,感興趣的朋友一起看看吧
    2025-02-02
  • 基于Java制作一個好玩的打飛機游戲

    基于Java制作一個好玩的打飛機游戲

    這篇文章主要介紹了基于Java制作的打飛機小游戲,這里整理了詳細的代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • VSCode?配置?Spring?Boot?項目開發(fā)環(huán)境的全過程

    VSCode?配置?Spring?Boot?項目開發(fā)環(huán)境的全過程

    兩三年前曾經試過配置Java環(huán)境, 存在不少問題作罷. 最近搜了下相關的文章, 感覺VSCode對Java項目的支持比三年前完善了不少. 今天實際配置了一下環(huán)境, 把自己常用的功能過了一遍, 基本能跑通開發(fā)流程, 做個筆記,需要的朋友可以參考下
    2024-03-03
  • Java文本編輯器實現(xiàn)方法詳解

    Java文本編輯器實現(xiàn)方法詳解

    這篇文章主要介紹了Java文本編輯器實現(xiàn)方法,結合實例形式詳細分析了java文本編輯器結構、原理、布局、實現(xiàn)步驟與相關操作技巧,需要的朋友可以參考下
    2019-03-03
  • java實現(xiàn)新浪微博Oauth接口發(fā)送圖片和文字的方法

    java實現(xiàn)新浪微博Oauth接口發(fā)送圖片和文字的方法

    這篇文章主要介紹了java實現(xiàn)新浪微博Oauth接口發(fā)送圖片和文字的方法,涉及java調用新浪微博Oauth接口的使用技巧,具有一定參考接借鑒價值,需要的朋友可以參考下
    2015-07-07
  • ??Spring Boot SPI 用法教程?

    ??Spring Boot SPI 用法教程?

    文章介紹了Java SPI(服務提供者接口)和Spring Boot中的SPI機制,包括它們的定義、使用方式和實戰(zhàn)示例,文章還討論了常見問題和最佳實踐,如版本兼容性、條件裝配、避免類路徑沖突以及擴展點選擇,感興趣的朋友一起看看吧
    2025-11-11

最新評論

大兴区| 鄂托克旗| 蓝山县| 鄢陵县| 瑞金市| 隆化县| 长阳| 永春县| 济源市| 巴马| 信宜市| 应城市| 黎城县| 罗源县| 华亭县| 凤凰县| 当涂县| 开阳县| 安义县| 桐梓县| 芒康县| 调兵山市| 彰化市| 天台县| 江西省| 疏勒县| 新巴尔虎左旗| 宁强县| 乌兰察布市| 台南市| 宜兴市| 金门县| 宜兰市| 理塘县| 台南县| 开远市| 镇安县| 犍为县| 宣恩县| 宁波市| 遵化市|