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

springboot程序打包docker的四個(gè)最佳方式總結(jié)

 更新時(shí)間:2026年04月02日 08:26:09   作者:神奇小湯圓  
這篇文章主要介紹了springboot程序打包docker的四個(gè)方式,本文將對(duì)比一下這幾種方式的大小區(qū)別,從而探索一下最佳的方式,感興趣的小伙伴可以了解下

緣起

云計(jì)算時(shí)代的來(lái)臨,有一門被我譽(yù)為云計(jì)算伴生的編程語(yǔ)言:golang

其與docker的天生的搭配,開(kāi)啟了云計(jì)算的黃金時(shí)代。

然而java確實(shí)一門不服老的語(yǔ)言,不斷的進(jìn)化著,springboot 4 和spring 7的發(fā)布,尤其是springboot4 ,GraalVM 25 直接從實(shí)驗(yàn)特性轉(zhuǎn)向了生產(chǎn)。虛擬線程常態(tài)化也是值得學(xué)習(xí)的特性。

加上還有很多的老的項(xiàng)目還在用springboot技術(shù),所以想把java的整個(gè)技術(shù)棧再撿起來(lái)學(xué)習(xí)一遍:后續(xù)會(huì)陸續(xù)寫一些關(guān)于springboot4 、jkd 25 lts的一些文。

學(xué)到哪兒就寫到哪兒:今天想試試springboot程序打包docker的幾種方式的大小區(qū)別,探索一下最佳的方式!

開(kāi)始

準(zhǔn)備一個(gè)最簡(jiǎn)單的restful的程序,使用spring initializr 生成項(xiàng)目,基礎(chǔ)配置如下:

注意2點(diǎn):1、java 25 2、加入graalvm

一個(gè)hello world

package com.example.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
class HelloController {
    @GetMapping("/hello")
    String sayHello(){
        return "hello world!";
    }
}

顯示編譯一下代碼,看看原始jar包有多大:

./gradlew build

一個(gè)包含mvc基本程序的一個(gè)hello world,大小79M

方式一:全默認(rèn)方式的打包鏡像

不做任何更多的配置,只使用springboot 4 和gradle的默認(rèn)配置:

根據(jù)資料,springboot的默認(rèn)使用paketobuildpacks/builder-jammy-tiny 鏡像,這是一個(gè)以u(píng)buntu 22為基礎(chǔ)的鏡像,大小50-70M:

注意:猶豫我們生成項(xiàng)目配置的時(shí)候加入了graalm支持,必須先注釋調(diào),否則默認(rèn)會(huì)使用graal技術(shù):

build.gradle 文件部分:

plugins {
	id 'java'
	id 'org.springframework.boot' version '4.0.3'
	id 'io.spring.dependency-management' version '1.1.7'
	//id 'org.graalvm.buildtools.native' version '0.11.4'
}

使用命令打包:

./gradlew bootBuildImage --imageName=hello:normal

大小337M,同時(shí)也可以看到打包下載的基礎(chǔ)鏡像:

方式二: 默認(rèn)配置graalvm打包

加入graalvm的配置(方式一注釋調(diào)的部分),打包:

./gradlew bootBuildImage --imageName=hello:gralvm

大小123M:

方式三: 手工打包,使用標(biāo)注openjdk鏡像為基礎(chǔ)

所謂手工打包,就是自己寫dockerfile,自己設(shè)置基礎(chǔ)鏡像,先試試默認(rèn)情況下常用的openjdk鏡像

FROM openjdk:25-jdk-slim
WORKDIR /app
RUN useradd -U spring
USER spring:spring
COPY build/libs/*.jar app.jar
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]

打包命令:

docker build -t hello:openjdk -f deploy/openjdk.Dockerfile .

大?。?05M

方式四: 手工打包,使用jlink構(gòu)建一個(gè)最小的運(yùn)行jre環(huán)境,以alpine為基礎(chǔ)

雖然現(xiàn)在的java不再單獨(dú)提供jre環(huán)境了,但是可以通過(guò)jlink構(gòu)建一個(gè)程序所需的最小運(yùn)行環(huán)境,然后部署到alpine linux上

FROM eclipse-temurin:25-jdk-alpine AS jre-builder
RUN apk update && apk add binutils
RUN $JAVA_HOME/bin/jlink \
         --verbose \
         --add-modules java.base \
         --strip-debug \
         --no-man-pages \
         --no-header-files \
         --compress=2 \
         --output /optimized-jdk-25
FROM alpine:latest
ENV JAVA_HOME=/opt/jdk/jdk-25
ENV PATH="${JAVA_HOME}/bin:${PATH}"
COPY --from=jre-builder /optimized-jdk-25 $JAVA_HOME
RUN addgroup --system spring && adduser --system spring --ingroup spring
RUN mkdir /app && chown -R $APPLICATION_USER /app
COPY --chown=spring:spring build/libs/*.jar /app/app.jar
WORKDIR /app
USER spring
EXPOSE 8080
ENTRYPOINT [ "java", "-jar", "/app/app.jar" ]

構(gòu)建命令:

docker build -t hello:alpine -f deploy/jlink.Dockerfile .

大?。?93M

有點(diǎn)不放心,跑一下試試:

docker run -it -p 8080:8080 hello:alpine

訪問(wèn)一下:

一切正常!

小結(jié)

以上只是比較了打包大小的不同,這對(duì)graalvm是不公平的,畢竟他的特點(diǎn)是增強(qiáng) AOT(Ahead-of-Time)編譯,降低內(nèi)存占用,提高啟動(dòng)時(shí)間,還是得測(cè)試一下:

docker run -it -p 8080:8080 --name alpine hello:alpine
docker run -it -p 9090:8080 --name graalvm hello:graalvm
docker stats

看到資源占用:

graalvm的內(nèi)存占用不到原始java代碼的1/4!

所以:

1、對(duì)應(yīng)新的項(xiàng)目,高版本jdk項(xiàng)目,尤其是最小的25版本,完全可以考慮以graalvm來(lái)編譯打包

2、對(duì)應(yīng)舊的項(xiàng)目,或者低版本jdk的項(xiàng)目,生產(chǎn)環(huán)境使用alpine定制jre的方式,就是方式4,測(cè)試環(huán)境就使用默認(rèn)openjdk:畢竟包含了大量的工具,方便調(diào)測(cè)。

以上就是springboot程序打包docker的四個(gè)最佳方式總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于springboot程序打包docker的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 對(duì)handlerexecutionchain類的深入理解

    對(duì)handlerexecutionchain類的深入理解

    下面小編就為大家?guī)?lái)一篇對(duì)handlerexecutionchain類的深入理解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • java7改善后的異常處理

    java7改善后的異常處理

    在本篇文章里小編給大家整理的是關(guān)于java7改善后的異常處理知識(shí)點(diǎn)總結(jié),有需要的朋友們參考下。
    2019-11-11
  • Java實(shí)現(xiàn)給網(wǎng)站上傳圖片蓋章的方法

    Java實(shí)現(xiàn)給網(wǎng)站上傳圖片蓋章的方法

    這篇文章主要介紹了Java實(shí)現(xiàn)給網(wǎng)站上傳圖片蓋章的方法,涉及java針對(duì)圖片的合成操作技巧,類似水印功能,需要的朋友可以參考下
    2015-07-07
  • MyBatis-Plus批量操作SQL日志不打印問(wèn)題的解決方案

    MyBatis-Plus批量操作SQL日志不打印問(wèn)題的解決方案

    在使用 MyBatis-Plus 的?saveBatch()?和?updateBatchById()?方法進(jìn)行批量數(shù)據(jù)操作時(shí),發(fā)現(xiàn)自定義的 Druid SQL 日志攔截器無(wú)法打印這些批量操作的 SQL 語(yǔ)句,導(dǎo)致調(diào)試和問(wèn)題排查困難,本文給大家該問(wèn)題的詳細(xì)解決方案,需要的朋友可以參考下
    2026-03-03
  • Java List 用法詳解及實(shí)例分析

    Java List 用法詳解及實(shí)例分析

    這篇文章主要介紹了Java List 用法詳解及實(shí)例分析的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Spring如何替換掉默認(rèn)common-logging.jar

    Spring如何替換掉默認(rèn)common-logging.jar

    這篇文章主要介紹了Spring如何替換掉默認(rèn)common-logging.jar,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • kafka監(jiān)聽(tīng)問(wèn)題的解決和剖析

    kafka監(jiān)聽(tīng)問(wèn)題的解決和剖析

    這篇文章主要給大家介紹了關(guān)于kafka監(jiān)聽(tīng)問(wèn)題的解決和剖析的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • java之Synchronized與Lock使用及說(shuō)明

    java之Synchronized與Lock使用及說(shuō)明

    Synchronized和Lock都是Java中用于實(shí)現(xiàn)線程同步的機(jī)制,但它們?cè)趯?shí)現(xiàn)方式、使用方式以及提供的特性上存在顯著的區(qū)別,Synchronized是Java語(yǔ)言內(nèi)置的同步機(jī)制,基于監(jiān)視器鎖(monitorlock)或?qū)ο箧i實(shí)現(xiàn),Lock是Java5中引入的一個(gè)接口,提供了比synchronized更靈活的鎖操作
    2026-01-01
  • java 重試框架 sisyphus 入門介紹

    java 重試框架 sisyphus 入門介紹

    sisyphus 綜合了 spring-retry 和 gauva-retrying 的優(yōu)勢(shì),使用起來(lái)也非常靈活,本文給大家介紹java 重試框架 sisyphus 入門相關(guān)知識(shí),感興趣的朋友一起看看吧
    2021-10-10
  • SpringBoot注冊(cè)web組件的實(shí)現(xiàn)方式

    SpringBoot注冊(cè)web組件的實(shí)現(xiàn)方式

    Servlet是Java Web應(yīng)用程序的基礎(chǔ),它提供了處理客戶端請(qǐng)求的機(jī)制,Servlet三大組件是指Servlet、Filter和Listener,它們是Java Web應(yīng)用程序的核心組件,本文將給大家介紹一下SpringBoot注冊(cè)web組件的實(shí)現(xiàn)方式,需要的朋友可以參考下
    2023-10-10

最新評(píng)論

成武县| 凤翔县| 阿尔山市| 高青县| 简阳市| 岑巩县| 托克托县| 玉树县| 咸宁市| 富顺县| 长治市| 工布江达县| 宜城市| 天等县| 淮南市| 德阳市| 扶沟县| 彝良县| 招远市| 镇安县| 拉萨市| 正定县| 乌苏市| 玉门市| 津南区| 乌兰县| 普兰店市| 科技| 山阳县| 蒙山县| 汾西县| 佳木斯市| 南木林县| 莒南县| 宁安市| 会泽县| 金乡县| 邳州市| 韶关市| 彭州市| 五家渠市|