Java(SpringBoot)專案打包(構建)成`Docker`映象的幾種方式

JanYork_小簡發表於2023-01-11

前置說明

  • 最為原始的打包方式
  • spring-boot-maven-plugin外掛
  • jib-maven-plugin外掛
  • dockerfle-maven-plugin外掛

最為原始的方式

也就是使用Docker的打包命令去打包,麻煩,我這裡不多說。

spring-boot-maven-plugin外掛打包

SpringBoot自己內建了一個Docker映象打包工具,在spring-boot-starter-parent中,我們無需多餘的設定。

優點:不需要寫DockerFile,Spring建議的安全、記憶體、效能等問題都不需要管。

jib-maven-plugin外掛

來自Google的一款打包外掛。

優點:不需要本地安裝Docker,也不需要寫DockerFileJib 可以直接推送到指定的Docker倉庫。

dockerfle-maven-plugin外掛

需要寫DockerFile也需要本地Docker環境,但是恰恰是最好用的,最穩定的,最自由把控的。

優點:穩定,不受網路限制,DockerFile自己寫,自由度很高,想怎麼改怎麼改,個人推薦這個。

SpringBoot打包映象

我們無需引入依賴,SpringBoot自帶了。

打包命令:

mvn spring-boot:build-image

但是我不喜歡用命令,IDEA都給你視覺化了,何必敲命令呢?而且命令還需要設定Maven環境變數。

就和打JAR包一樣,我們點一下就可以。

但是SpringBoot的打包會因為網路(不通暢),而導致失敗。

打包完成是這樣:

我們去檢視本地映象有沒有。

執行測試一下。

說實話我執行失敗了,因為我專案裡面有一下東西它不好搞,比如微信支付的證照檔案和KEY檔案,一般的SpringBoot專案可以,但是我這個恰恰不行,我需要自己寫DockerFile去建立卷對映才好。

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節點用來設定映象的基礎映象,相當於Docerkfile中的FROM關鍵字-->
                    <from>
                        <!--基礎映象名稱(建議使用國內公開映象,下載速度快,更穩定) -->
                        <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
# 建立目錄
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,並且開啟遠端連線,WindowsDocker安裝小簡上一篇文章寫過的,可以看看,Linux的沒寫。

好用多了,一次成功。

還是這個最好用,推薦!!!

總結

小簡選擇的是最後一個,第一個也還行吧,但是Google那個不需要本地有Docker環境,第一個我還是開著魔法(梯子)打包的,最後一個挺好的。

看情況選擇的,很久沒更新啦!越來越懶了,嘿嘿,下篇再見。

相關文章