自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

怎么把一個(gè)Java應(yīng)用打包成Docker鏡像

開(kāi)發(fā) 后端
怎么把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文件即可。

[[416444]]

本文轉(zhuǎn)載自微信公眾號(hào)「網(wǎng)管叨bi叨」,作者KevinYan11。轉(zhuǎn)載本文請(qǐng)聯(lián)系網(wǎng)管叨bi叨公眾號(hào)。

怎么把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)建鏡像。

  1. FROM openjdk:8-jre 
  2. ADD target/*.jar /application.jar 
  3. ENTRYPOINT ["java""-jar","/application.jar"

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

  1. project 
  2. │   pom.xml 
  3. └───src // 源文件目錄 
  4. │   │ 
  5. │   └───main 
  6. │       │    
  7. │       └───java 
  8. │        
  9. └───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)用鏡像的打包。

  1. <groupId>com.example</groupId> 
  2.     <artifactId>hello-spring</artifactId> 
  3.     <version>0.0.1-SNAPSHOT</version> 
  4.     <name>helloworld</name
  5. <plugin> 
  6.  <groupId>com.spotify</groupId> 
  7.  <artifactId>dockerfile-maven-plugin</artifactId> 
  8.  <version>1.4.10</version> 
  9.  <executions> 
  10.   <execution> 
  11.   <id>default</id> 
  12.       <goals> 
  13.         <goal>build</goal> 
  14.         <goal>push</goal> 
  15.       </goals> 
  16.     </execution> 
  17.   </executions> 
  18.   <configuration> 
  19.     <repository>${docker.registry.url}/${image.prefix}/${artifactId}</repository> 
  20.     <tag>${project.version}</tag> 
  21.     <buildArgs> 
  22.       <JAR_FILE>${project.build.finalName}.jar</JAR_FILE> 
  23.     </buildArgs> 
  24.   </configuration> 
  25. </plugin> 

 

 

 

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

  1. <properties> 
  2.  <java.version>1.8</java.version> 
  3.   <image.prefix>kevinyan001</image.prefix> 
  4.   <docker.registry.url></private.registry.url> 
  5. </properties> 

 

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

  1. <properties> 
  2.   <java.version>1.8</java.version> 
  3.   <image.prefix>docker-demo</image.prefix> 
  4.   <docker.registry.url>registry.cn-beijing.aliyuncs.com</docker.registry.url> 
  5. </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鏡像打包。

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

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

  1. 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)行探討了。

 

責(zé)任編輯:武曉燕 來(lái)源: 網(wǎng)管叨bi叨
相關(guān)推薦

2021-06-04 06:20:08

工具Kubernetes集群

2024-11-14 13:19:21

Docker容器開(kāi)發(fā)

2011-07-08 13:44:08

Xcode 打包

2009-06-10 20:44:18

netbeans 打包JAR文件

2020-10-11 20:54:39

Python開(kāi)發(fā)Docker

2011-11-16 13:14:02

Sencha TouciOS本地應(yīng)用

2020-07-31 10:26:15

Mac OS蘋(píng)果Windows

2022-08-29 08:28:58

JS對(duì)象數(shù)組

2015-01-20 13:46:31

Java EEDockerDocker部署

2014-11-05 11:08:36

阿里云DockerPaas

2014-11-25 14:04:59

DockerDocker Nodeweb應(yīng)用部署

2022-07-29 07:04:03

Docker鏡像容器

2022-01-11 09:59:23

Python關(guān)機(jī)程序文件

2023-12-04 08:28:35

Docker容器

2014-05-26 09:13:46

DockerPython

2020-09-28 15:55:32

開(kāi)源技術(shù) 工具

2018-01-09 20:22:49

容器Docker桌面系統(tǒng)

2023-09-14 20:55:52

NodeJSDocker

2015-10-08 09:28:47

JavaDocker鏡像

2021-05-19 17:25:12

Pythonexe命令
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)