Java(SpringBoot)項目打包(構建)成Docker鏡像的幾種常見方式
前置說明
- 最為原始的打包方式
spring-boot-maven-plugin插件jib-maven-plugin插件dockerfle-maven-plugin插件
最為原始的方式
也就是使用
Docker的打包命令去打包,麻煩,我這里不多說。
spring-boot-maven-plugin插件打包
SpringBoot自己內置了一個
Docker鏡像打包工具,在spring-boot-starter-parent中,我們無需多余的設置。優(yōu)點:不需要寫
DockerFile,Spring建議的安全、內存、性能等問題都不需要管。
jib-maven-plugin插件
來自
優(yōu)點:不需要本地安裝
Docker,也不需要寫DockerFile,Jib可以直接推送到指定的Docker倉庫。
dockerfle-maven-plugin插件
需要寫
DockerFile也需要本地Docker環(huán)境,但是恰恰是最好用的,最穩(wěn)定的,最自由把控的。優(yōu)點:穩(wěn)定,不受網絡限制,DockerFile自己寫,自由度很高,想怎么改怎么改,個人推薦這個。
SpringBoot打包鏡像
我們無需引入依賴,SpringBoot自帶了。
打包命令:
mvn spring-boot:build-image
但是我不喜歡用命令,IDEA都給你可視化了,何必敲命令呢?而且命令還需要設置Maven環(huán)境變量。

就和打JAR包一樣,我們點一下就可以。
但是SpringBoot的打包會因為網絡(不通暢),而導致失敗。
打包完成是這樣:

我們去查看本地鏡像有沒有。

運行測試一下。

說實話我運行失敗了,因為我項目里面有一下東西它不好搞,比如微信支付的證書文件和KEY文件,一般的SpringBoot項目可以,但是我這個恰恰不行,我需要自己寫DockerFile去創(chuàng)建卷映射才好。
JIB打包鏡像
配置插件依賴:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
<configuration>
<mainClass>com.toemail.smtp.ToEmailApplication</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>3.3.1</version>
<configuration>
<!--from節(jié)點用來設置鏡像的基礎鏡像,相當于Docerkfile中的FROM關鍵字-->
<from>
<!--基礎鏡像名稱(建議使用國內公開鏡像,下載速度快,更穩(wěn)定) -->
<image>java:8u172-jre-alpine</image>
</from>
<to>
<!--鏡像名稱和tag,使用了mvn內置變量${project.version},表示當前工程的version-->
<image>demo:${project.version}</image>
</to>
<!--容器相關的屬性-->
<container>
<!--jvm內存參數-->
<jvmFlags>
<jvmFlag>-Xms4g</jvmFlag>
<jvmFlag>-Xmx4g</jvmFlag>
</jvmFlags>
<!--要暴露的端口-->
<ports>
<port>8899</port>
</ports>
</container>
</configuration>
</plugin>
我這里用的目前最新版本。

另外,很多配置我都寫了注釋,如果你想了解更多可以查一下JIB的相關文檔。
命令
mvn compile com.google.cloud.tools:jib-maven-plugin:2.3.0:dockerBuild
IDEA

報錯
如果出現這錯誤:

就添加以下配置:

還是報錯

好像是它這個官方倉庫需要認證登錄,我靠,我真不喜歡這破插件,垃圾(暗暗罵道)。
突然解決

這個鏡像,需要指定具體倉庫URL地址的。
但是我現在這個不行,所以我要換一個阿里的倉庫。

改成了這樣:
<to> <image>registry.cn-qingdao.aliyuncs.com/jibjava/jibfirst</image> </to>
阿里云有時候私有倉庫需要密碼,也可以換成其他私有倉庫。
<from>
<image>registry.cn-qingdao.aliyuncs.com/jibjava/jibfirst</image>
<auth>
<username>阿里云賬號</username>
<password>阿里云密碼</password>
</auth>
</from>
XML標簽詳解
from:拉取的鏡像的配置,默認為gcr.io/distroless/java
to:要生成的鏡像的配置
image:拉取或生成的鏡像名稱
auth: 認證信息,分別為用戶名和密碼
container: 容器的屬性
jvmFlgs: JVM 容器的參數,和 Dockerfile 的 ENTRYPOINT作用相同
mainClass: 啟動類限定名
args: main 方法的傳入參數
ports: 容器暴露的端口,和 Dockerfile 的EXPOSE作用相同
成功


DockerFileMaven打包
寫DockerFile:
FROM c9katayama/java8:latest # 創(chuàng)建目錄 RUN mkdir -p /dashboard # 拷貝文件 COPY dashboard.jar /dashboard/dashboard.jar # 暴露端口 EXPOSE 8099 # 啟動命令 CMD ["java", "-jar", "/dashboard/dashboard.jar"]
DockerFile不多說,請自行學習。
依賴展示:
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.11</version>
<dependencies>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>javax.activation-api</artifactId>
<version>1.2.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<imageTags>
<imageTag>${project.version}</imageTag>
<imageTag>latest</imageTag>
</imageTags>
</configuration>
</plugin>
但是這一段插件的XML別用,因為這是rocketmq可視化控制臺的官方寫的,你可以自己配置。

正常的一般插件的XML就這樣:
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<imageName>${project.artifactId}:${project.version}</imageName>
<!-- 指定 Dockerfile 路徑-->
<dockerDirectory>${basedir}/docker</dockerDirectory>
<!-- 這里是復制 jar 包到 docker 容器指定目錄配置,也可以寫到 Docokerfile 中 -->
<resources>
<resource>
<targetPath>/ROOT</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
其余配置可以自行瀏覽器搜索一下:docker-maven-plugin配置項
構建命令
mvn package
嘗試打包
我這里直接IDEA點擊打包,討厭命令。

注意:需要本地有
Docker,并且開啟遠程連接,Windows的Docker安裝小簡上一篇文章寫過的,可以看看,Linux的沒寫。
好用多了,一次成功。


還是這個最好用,推薦!?。?/p>
總結
小簡選擇的是最后一個,第一個也還行吧,但是Google那個不需要本地有Docker環(huán)境,第一個我還是開著魔法(梯子)打包的,最后一個挺好的。
到此這篇關于Java(SpringBoot)項目打包(構建)成Docker鏡像的幾種常見方式的文章就介紹到這了,更多相關SpringBoot打包成Docker鏡像內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
簡介Java的Hibernate框架中的Session和持久化類
這篇文章主要介紹了Java的Hibernate框架中的Session和持久化類,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-12-12
lambda表達式與傳統(tǒng)接口函數實現方式對比詳解
這篇文章主要為大家介紹了lambda表達式與傳統(tǒng)接口函數實現方式對比詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家度偶多進步早日升職加薪2022-03-03
Java中的信息摘要算法MessageDigest類用法詳解
這篇文章主要介紹了Java中的信息摘要算法MessageDigest類用法詳解,java.security.MessageDigest類為應用程序提供信息摘要算法的功能,如MD5或SHA-1或SHA-256算法,信息摘要是安全的單向哈希函數,它接收任意大小的數據,并輸出固定長度的哈希值,需要的朋友可以參考下2024-01-01

