亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java應(yīng)用打包成Docker鏡像

 更新時(shí)間:2022年06月21日 14:44:24   作者:網(wǎng)管叨bi叨  
這篇文章主要為大家介紹了Java應(yīng)用打包成Docker鏡像的過(guò)程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

怎么把Java應(yīng)用打包成Docker鏡像?

對(duì)熟悉Docker的同學(xué)這應(yīng)該是一個(gè)很簡(jiǎn)單的問(wèn)題,把項(xiàng)目打包成JAR包然后在Dockerfile里用ADD命令把JAR文件放到鏡像里,啟動(dòng)命令設(shè)置執(zhí)行這個(gè)JAR文件即可。

比如一個(gè)使用Maven構(gòu)建的Spring應(yīng)用就可以用下面這個(gè)Dockerfile構(gòu)建鏡像。

FROM?openjdk:8-jre
ADD?target/*.jar?/application.jar
ENTRYPOINT?["java",?"-jar","/application.jar"]

上面這個(gè)Dockerfile很好理解,使用Maven構(gòu)建的Java項(xiàng)目的目錄結(jié)構(gòu)統(tǒng)一是

project
│???pom.xml
└───src?//?源文件目錄
│???│
│???└───main
│???????│???
│???????└───java
│???????
└───target?//?class和jar文件的目錄

用mvn clean package打包后會(huì)把JAR文件生成在target目錄里,通過(guò)java -jar命令即可執(zhí)行編譯好的程序。

所以上面的Dockerfile里就進(jìn)行了把JAR從target目錄里添加到Docker鏡像中以及將jar -jar /application.jar 設(shè)置成容器的啟動(dòng)命令這兩步操作。

不過(guò)除了這種最原始的方法外我們還可以使用Maven的一些插件,或者Docker的多階段打包功能來(lái)完成把Java應(yīng)用打包成Docker鏡像的動(dòng)作。

Maven插件構(gòu)建鏡像

Spotify公司的dockerfile-maven-plugin和Google公司出品的jib-maven-plugin是兩款比較有名的插件,下面簡(jiǎn)單介紹一下dockerfile-maven-plugin的配置和使用。

其實(shí)使用方法很簡(jiǎn)單,我們?cè)赑OM文件里引入這個(gè)plugin,并結(jié)合上面那個(gè)Dockerfile就能讓插件幫助我們完成應(yīng)用鏡像的打包。

<groupId>com.example</groupId>
????<artifactId>hello-spring</artifactId>
????<version>0.0.1-SNAPSHOT</version>
????<name>helloworld</name>
<plugin>
?<groupId>com.spotify</groupId>
?<artifactId>dockerfile-maven-plugin</artifactId>
?<version>1.4.10</version>
?<executions>
??<execution>
??<id>default</id>
??????<goals>
????????<goal>build</goal>
????????<goal>push</goal>
??????</goals>
????</execution>
??</executions>
??<configuration>
????<repository>${docker.registry.url}/${image.prefix}/${artifactId}</repository>
????<tag>${project.version}</tag>
????<buildArgs>
??????<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
????</buildArgs>
??</configuration>
</plugin>

插件里使用的docker.registry.url和image.prefix是我單獨(dú)為Docker的鏡像倉(cāng)庫(kù)設(shè)置的屬性。

<properties>
?<java.version>1.8</java.version>
??<image.prefix>kevinyan001</image.prefix>
??<docker.registry.url></private.registry.url>
</properties>

這里可以隨意設(shè)置成私有倉(cāng)庫(kù)的遠(yuǎn)程地址和鏡像前綴,比如在阿里云的鏡像服務(wù)上創(chuàng)建一個(gè)叫docker-demo的空間,上面的屬性就需要這樣配置:

<properties>
??<java.version>1.8</java.version>
??<image.prefix>docker-demo</image.prefix>
??<docker.registry.url>registry.cn-beijing.aliyuncs.com</docker.registry.url>
</properties>

在POM文件里配置好插件后伴隨著我們打包應(yīng)用執(zhí)行mvc clean package操作時(shí)dockerfile-maven-plugin就會(huì)自動(dòng)根據(jù)我們的配置打包好一個(gè)叫做kevinyan001/hello-spring:0.0.1-SNAPSHOT的Docker鏡像。

dockerfile-maven-plugin除了能幫助我們打包應(yīng)用鏡像外還可以讓它幫助我們把鏡像push到遠(yuǎn)端倉(cāng)庫(kù),不過(guò)我覺(jué)得用處不大,感興趣的同學(xué)可以去網(wǎng)上搜搜看這部分功能怎么配置。

用Docker的多階段構(gòu)建打包鏡像

上面介紹了使用Maven插件幫助我們打包Java應(yīng)用的鏡像,其實(shí)我們還可以把mvn clean package這一步也交給Docker來(lái)完成。當(dāng)然把Java應(yīng)用的源碼放在Docker鏡像里再編譯打包在發(fā)布出去肯定是有問(wèn)題的,我們知道在Dockerfile里每個(gè)指令A(yù)DD、RUN這些都是在單獨(dú)的層上進(jìn)行,指令越多會(huì)造成鏡像越大,而且包含Java項(xiàng)目的源碼也是一種風(fēng)險(xiǎn)。

不過(guò)好在后來(lái)Docker支持了多階段構(gòu)建,允許我們?cè)谝粋€(gè)Dockerfile里定義多個(gè)構(gòu)建階段,先拉起一個(gè)容器完成用于的構(gòu)建,比如說(shuō)我們可以在這個(gè)階段里完成JAR的打包,然后第二個(gè)階段重新使用一個(gè)jre鏡像把上階段打包好的JAR文件拷貝到新的鏡像里。

這一點(diǎn)在Go語(yǔ)言比較有優(yōu)勢(shì),第一階段編譯好的二進(jìn)制執(zhí)行文件直接拷貝到一個(gè)最基礎(chǔ)的linux鏡像里就能讓Go的應(yīng)用在容器里運(yùn)行。關(guān)于Go應(yīng)用的多階段打包,可以查看我以前的文章線上Go項(xiàng)目的Docker鏡像應(yīng)該怎么構(gòu)建? 進(jìn)行了解。

使用下面的Dockerfile可以通過(guò)多階段構(gòu)建完成Java應(yīng)用的Docker鏡像打包。

#?Dockerfile也可以不放在項(xiàng)目目錄下,通過(guò)?-f?指定Dockerfile的位置,比如在項(xiàng)目根下執(zhí)行以下命令?
docker?build?-t?<some?tag>?-f?<dirPath/Dockerfile>?.
FROM?kevinyan001/aliyun-mvn:0.0.1?AS?MAVEN_BUILD
COPY?pom.xml?/build/
COPY?src?/build/src
WORKDIR?/build/
#?mount?anonymous?host?directory?as?.m2?storage?for?contianer?
VOLUME?/root/.m2
RUN?mvn?clean?package?-Dmaven.test.skip=true?--quiet
FROM?openjdk:8-jre
COPY?--from=MAVEN_BUILD?/build/target/*.jar?/app/application.jar
ENTRYPOINT?["java",?"-jar",?"/app/application.jar"]

上面我們用的這些Dockerfile也可以不用放在項(xiàng)目的根目錄里,現(xiàn)在已經(jīng)支持通過(guò) -f 指定Dockerfile的位置,比如在項(xiàng)目根下執(zhí)行以下命令完成鏡像的打包。

docker?build?-t?kevinyan001/hello-spring:0.0.1?-f?<dirPath/Dockerfile>?.

上面第一個(gè)鏡像是我自己做的,因?yàn)镸aven官方的鏡像的遠(yuǎn)程倉(cāng)庫(kù)慢的一批,只能自己包裝一下走阿里云的鏡像源了。試了試速度也不快,主要是隨隨便便一個(gè)Spring項(xiàng)目依賴就太多了。大家如果這塊有什么加快Docker 構(gòu)建速度的方法也可以留言一起討論討論。

不可否認(rèn)用多階段構(gòu)建打出來(lái)的Go鏡像基本上是10M左右,但是Spring的應(yīng)用隨隨便便就是上百兆,這個(gè)對(duì)容器的構(gòu)建速度、網(wǎng)絡(luò)傳輸成本是有影響的,那么Spring應(yīng)用的鏡像怎么瘦身呢,這個(gè)就留到以后的文章進(jìn)行探討了,更多關(guān)于Java打包成Docker鏡像的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java中的序列化解析

    java中的序列化解析

    這篇文章主要介紹了java中的序列化解析,為了將對(duì)象進(jìn)行網(wǎng)絡(luò)傳輸或者是持久化,我們需要將對(duì)象的狀態(tài)信息轉(zhuǎn)換為可以存儲(chǔ)或者傳輸?shù)男问?這個(gè)轉(zhuǎn)換的過(guò)程就叫序列化,需要的朋友可以參考下
    2023-09-09
  • Java Spring框架的概述

    Java Spring框架的概述

    這篇文章主要為大家介紹了Java Spring框架,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • SpringBoot集成支付寶支付的實(shí)現(xiàn)示例

    SpringBoot集成支付寶支付的實(shí)現(xiàn)示例

    本文主要介紹了SpringBoot集成支付寶支付的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • jvm運(yùn)行原理以及類加載器實(shí)例詳解

    jvm運(yùn)行原理以及類加載器實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于jvm運(yùn)行原理以及類加載器的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Java?LockSupport常用方法的源碼分析

    Java?LockSupport常用方法的源碼分析

    這篇文章主要為大家詳細(xì)介紹了Java?LockSupport類中的方法和部分源碼,以及面試常問(wèn)到的一個(gè)小問(wèn)題,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-02-02
  • Feign Client 超時(shí)時(shí)間配置不生效的解決

    Feign Client 超時(shí)時(shí)間配置不生效的解決

    這篇文章主要介紹了Feign Client 超時(shí)時(shí)間配置不生效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java二維數(shù)組與動(dòng)態(tài)數(shù)組ArrayList類詳解

    Java二維數(shù)組與動(dòng)態(tài)數(shù)組ArrayList類詳解

    這篇文章主要給大家介紹了關(guān)于Java二維數(shù)組與動(dòng)態(tài)數(shù)組ArrayList類的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(22)

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

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

    SpringBoot中的文件上傳與下載詳解

    這篇文章主要介紹了SpringBoot中的文件上傳與下載詳解,springboot是spring家族中的一個(gè)全新框架,用來(lái)簡(jiǎn)化spring程序的創(chuàng)建和開(kāi)發(fā)過(guò)程,本文我們就一起來(lái)看看上傳與下載的操作,需要的朋友可以參考下
    2023-08-08
  • Java獲取當(dāng)前時(shí)間年月日的方法

    Java獲取當(dāng)前時(shí)間年月日的方法

    這篇文章主要為大家詳細(xì)介紹了Java獲取當(dāng)前時(shí)間年月日的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11

最新評(píng)論