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

SpringBoot項(xiàng)目docker分層鏡像構(gòu)建案例

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

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

為什么使用分層 Docker 鏡像?

傳統(tǒng)的 Docker 鏡像構(gòu)建方式會(huì)將整個(gè)應(yīng)用程序 JAR/WAR 文件復(fù)制到一個(gè)層中。當(dāng)你修改代碼時(shí),整個(gè)層都會(huì)失效,導(dǎo)致 Docker 必須重新構(gòu)建整個(gè)應(yīng)用程序?qū)樱词怪皇亲隽宋⑿〉拇a更改。

通過我們的分層方法,我們將以下內(nèi)容分離:

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

這樣,當(dāng)你修改代碼時(shí),只需要重新構(gòu)建應(yīng)用程序代碼層,而依賴層可以從緩存中重用。

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>
        <!-- 如果使用預(yù)覽特性 -->
        <compilerArgs>
          <arg>--enable-preview</arg>
        </compilerArgs>
        <release>21</release>
      </configuration>
    </plugin>
  </plugins>
</build>

工作原理

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

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

外部依賴復(fù)制配置

<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í)行的唯一標(biāo)識符

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

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

<configuration>: 配置詳情

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

內(nèi)部依賴復(fù)制配置

<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í)行的唯一標(biāo)識符

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

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

<configuration>: 配置詳情

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

通過這兩個(gè)執(zhí)行配置,Maven 會(huì)在 package 階段自動(dòng)將依賴分別復(fù)制到對應(yīng)的目錄中:

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

2. 分層 Dockerfile 詳解

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

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

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

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

# 3. 復(fù)制應(yīng)用程序類(經(jīng)常更改)
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 運(yùn)行時(shí)環(huán)境

WORKDIR /app: 設(shè)置工作目錄為 /app

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

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

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

EXPOSE 8080: 暴露應(yīng)用程序端口

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

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

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

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

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

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

3. 構(gòu)建過程詳解

Maven 構(gòu)建生命周期集成

當(dāng)執(zhí)行 mvn package 命令時(shí),Maven 會(huì)按照以下順序執(zhí)行構(gòu)建階段:

  1. validate - 驗(yàn)證項(xiàng)目正確性
  2. compile - 編譯源代碼
  3. test - 運(yùn)行測試
  4. package - 打包應(yīng)用程序

在 package 階段,maven-dependency-plugin 會(huì)自動(dòng)執(zhí)行我們配置的兩個(gè)依賴復(fù)制任務(wù):

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

完整構(gòu)建步驟

清理并打包應(yīng)用程序:

mvn clean package

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

  • target/classes/ - 應(yīng)用程序編譯后的類文件
  • target/lib/external/ - 外部依賴 JAR 文件
  • target/lib/internal/ - 內(nèi)部依賴 JAR 文件
  1. 構(gòu)建 Docker 鏡像:
docker build -t sp3-layer .

Docker 構(gòu)建過程會(huì)按順序創(chuàng)建四個(gè)層:

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

構(gòu)建優(yōu)化效果

由于 Docker 的層緩存機(jī)制:

  • 當(dāng)只修改應(yīng)用程序代碼時(shí),只有最后一層需要重建
  • 當(dāng)添加新的外部依賴時(shí),需要重建外部依賴層及其后的所有層
  • 當(dāng)添加新的內(nèi)部依賴時(shí),需要重建內(nèi)部依賴層和應(yīng)用程序類層
  • 只有基礎(chǔ)鏡像變更時(shí),才需要完全重建

優(yōu)勢

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

版本更新工作流程

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

配置自定義指南

要將此配置應(yīng)用于其他項(xiàng)目,您需要根據(jù)項(xiàng)目的依賴結(jié)構(gòu)調(diào)整配置:

修改依賴分組

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

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

最佳實(shí)踐

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

這種方法可以顯著減少 CI/CD 流水線中的構(gòu)建時(shí)間,并在部署更新時(shí)最小化網(wǎng)絡(luò)傳輸。

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

相關(guān)文章

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

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

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

    MyBatis注解實(shí)現(xiàn)動(dòng)態(tài)SQL問題

    這篇文章主要介紹了MyBatis注解實(shí)現(xiàn)動(dòng)態(tài)SQL問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    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項(xiàng)目中,讀取配置文件信息是常見需求,可以通過@Autowired注入Environment類,使用@Value注解直接注入配置信息,或定義工具類結(jié)合ApplicationRunner進(jìn)行高級配置信息獲取,特別提到
    2024-11-11
  • Springboot?中使用Sentinel的詳細(xì)步驟

    Springboot?中使用Sentinel的詳細(xì)步驟

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

    基于Java制作一個(gè)好玩的打飛機(jī)游戲

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

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

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

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

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

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

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

    ??Spring Boot SPI 用法教程?

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

最新評論

岑溪市| 汶上县| 资中县| 玛多县| 阿拉尔市| 石景山区| 平安县| 临颍县| 延边| 红安县| 玉溪市| 荃湾区| 云阳县| 南郑县| 普兰县| 赤水市| 潮州市| 手机| 泉州市| 景宁| 库尔勒市| 疏附县| 武强县| 卢龙县| 闸北区| 英山县| 洛阳市| 长子县| 通河县| 新源县| 自贡市| 綦江县| 昆山市| 葵青区| 广饶县| 甘德县| 余干县| 斗六市| 沧州市| 武宣县| 吐鲁番市|