Java的jar包構建成docker鏡像並運行


結構如下

 

把jar和Dockerfile放到一個文件,不在一個文件下會報錯文件找不到

創建一個構建文件

buildimage.sh

vi /home/hanby/buildimage.sh

echo "運行創建鏡像腳本"
docker build -t gateway:2.4.3 .

 

Dockerfile創建鏡像

vi /home/hanby/Dockerfile

# 版本信息
#java:latest 為centos官方java運行環境鏡像,600多M ,可以提前pull到主機本地
FROM java:latest

#MAINTAINER "指定作者或其他信息"

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

RUN mkdir -p /jeecg-cloud-gateway

WORKDIR /jeecg-cloud-gateway

#實際上可以配置成變量
ADD jeecg-cloud-gateway-2.4.3.jar /usr/local/jar/

RUN mv /usr/local/jar/jeecg-cloud-gateway-2.4.3.jar /usr/local/jar/gateway.jar

#開啟內部服務端口 cicd-demo 項目端口
EXPOSE 9999

CMD ["java","-jar","/usr/local/jar/gateway.jar"]

 

run.sh 創建

vi /home/hanby/run.sh

echo "移除原本gateway鏡像"
docker rm -f gateway
echo "運行新的gateway鏡像,端口為9999"
#docker run --name="gateway" -p 9999:9999 -d gateway:2.4.3
docker run -d --restart=always --name gateway -v /home/jenkins-jar/buildgatewayImage/logs/:/logs/gateway/ -p 9999:9999 gateway:2.4.3

 

執行 ./buildgatewayImage.sh

  ./run-gateway-9999.sh

 

運行結果

 

出現的問題解決方法

 如果用127.0.0.1訪問docke啟動的mysql,會報錯,應該使用宿主機ip,或者在啟動命令中添加--net=host,使容器和宿主機ip一致

 如果出現宿主機和容器時間一致,但日志時間相差8小時,則在啟動命令中添加如下:

        -v /etc/timezone:/etc/timezone:ro \
        -v /etc/localtime:/etc/localtime:ro \

    用鏈接讓容器使用系統時區

如果是springboot項目,也可以在啟動類添加

  TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai")); 

 

 

 然而jar的大小總的來說還是很大,所有使用瘦身打包,可以把每個jar分離為依賴組件lib目錄和一個業務jar來進行部署,優化單個jar文件大小到一兩百KB。

  

 但是對於很多個微服務,每個服務一個jar和一個lib目錄文件,首次部署也差不多需要傳輸一兩個GB文件。

    所以合並所有模塊依賴jar到同一個lib目錄,一般由於各模塊項目依賴jar重疊程度很高,合並所有服務部署文件總計大小基本也就兩三百MB

    啟動過程不再需要 -Djava.ext.dirs=lib 參數定義,所有微服務jar引用所有項目合並依賴組件的公共目錄,部署文件總計大小一般在兩三百MB,通過定制每個微服務jar文件中的META-INFO/MANIFEST文件中的Class-Path明確指明依賴版本組件類,解決各微服務不同組件版本沖突問題。

  

   微服務配置,可以給父pom配置,如果其中有不需要瘦身打包的,則需要單獨配置每一個需要瘦身打包的服務,也可以排除不需要瘦身打包,怎樣方便怎樣來

   父pom配置

<build>
<finalName>${project.artifactId}</finalName>
<!--
特別注意:
項目僅僅是為了演示配置方便,直接在parent的build部分做了插件配置和運行定義。
但是實際項目中需要把這些定義只放到spring boot模塊項目(可優化使用pluginManagement形式),避免干擾其他util、common等模塊項目
-->
<plugins>
<!-- 基於maven-jar-plugin插件實現把依賴jar定義寫入輸出jar的META-INFO/MANIFEST文件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<useUniqueVersions>false</useUniqueVersions>
</manifest>
</archive>
</configuration>
</plugin>
<!-- 拷貝項目所有依賴jar文件到構建lib目錄下 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!--
各子模塊按照實際層級定義各模塊對應的屬性值,檢查所有微服務模塊依賴jar文件合並復制到同一個目錄
詳見各子模塊中 boot-jar-output 屬性定義
-->
<outputDirectory>${boot-jar-output}/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>false</stripVersion>
<silent>false</silent>
</configuration>
</execution>
</executions>
</plugin>
<!-- Spring Boot模塊jar構建 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includes>
<!-- 不存在的include引用,相當於排除所有maven依賴jar,沒有任何三方jar文件打入輸出jar -->
<include>
<groupId>null</groupId>
<artifactId>null</artifactId>
</include>
</includes>
<layout>ZIP</layout>
<!--
基於maven-jar-plugin輸出微服務jar文件進行二次spring boot重新打包文件的輸出目錄
所有微服務構建輸出jar文件統一輸出到與lib同一個目錄,便於共同引用同一個lib目錄
詳見各子模塊中boot-jar-output屬性定義
-->
<outputDirectory>${boot-jar-output}</outputDirectory>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!--###################瘦身打包######################################-->

子pom配置

<!--###########瘦身打包###########文件路徑自己定義即可-->
<properties>
<java.version>8</java.version>
<boot-jar-output>../toImageJar</boot-jar-output>
</properties>

 

   打包結果如下

 

        

 

docker 配置

Dockerfile 修改

 

# 版本信息
#java:latest 為centos官方java運行環境鏡像,600多M ,可以提前pull到主機本地
FROM java:latest

#MAINTAINER "指定作者或其他信息"

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

#RUN mkdir -p /jeecg-cloud-pay

#在jar文件目錄下創建一個lib

RUN mkdir -p /usr/local/jar/lib

#WORKDIR /jeecg-cloud-pay

#實際上可以配置成變量
ADD jeecg-cloud-flh-pay.jar /usr/local/jar/

#COPY lib /usr/local/jar/lib

RUN mv /usr/local/jar/jeecg-cloud-flh-pay.jar /usr/local/jar/pay.jar

#開啟內部服務端口 pay項目端口
EXPOSE 7006

CMD ["java","-Xms1024m","-Xmx1024m","-jar","/usr/local/jar/pay.jar"]

 

run-pay-7006.sh 配置

echo "移除原本pay鏡像"
docker rm -f pay
echo "運行新的pay鏡像"
docker run -d --restart=always --name pay \
--net=host \
-v /etc/timezone:/etc/timezone:ro \
-v /etc/localtime:/etc/localtime:ro \
-v /data/soft/imageAPP/logs/pay/:/logs/pay/ \
-v /data/soft/imageAPP/lib:/usr/local/jar/lib \      映射目錄,如此就只需要一個lib即可,也可以copy  lib到容器(麻煩,必須在每個容器里面復制一份)
-p 7006:7006 pay:2.4.3

 

其他打包方式參考 https://mp.weixin.qq.com/s/hstk9tXzKt-Up20kD5x0fg


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM