應用上K8S第三步:Maven打包

網路通訊頻道發表於2023-01-30

對於spring boot專案我們一般使用Maven或Gradle進行編譯打包,也可以藉助docker plugin進行映象打包並push到遠端倉庫。因此在經過《應用上K8S第一步:Dockerfile引數化構建技巧》一文,我們已經確定了Dockerfile,那麼應用上K8S第二步:maven打包就可以開始了。

現在我們就來介紹下maven打包,大家感興趣的話也可以和gradle打包對比下,並進一步掌握這兩種方式。

手動構建spring boot應用

一、helloworld應用

1.建立spring boot工程

2.建立HelloworldController

3.編譯執行

此時我們可以透過localhost:8080訪問了。

二、docker構建映象

1.Dockerfile

2.構建映象並執行容器

此時我們可以透過localhost:8080訪問了。

以上是透過手動執行jar包及透過映象的形式執行應用,其實mvn也提供相應的外掛自動構建映象。

mvn構建docker映象

一、配置mvn外掛

docker-maven-plugin作用是配合Dockerfile構建docker映象,推送到docker倉庫。還可以使用dockerfile-maven-plugin

其中:

(1)imageName 是構建映象的名稱;

(2)dockerDirectory是Dockerfile位置,最好是隻有Dockerfile,因為在mvn打包時此目錄下的所有檔案包括Dockerfile將會被copy到${project.build.directory}/docker目錄下,此目錄預設是target/docker目錄;

(3)resource作用是將${project.build.directory}目錄下的${project.build.finalName}.jar,複製到${project.build.directory}/docker目錄下;如:將target/helloworld-0.0.1-SNAPSHOT.jar 檔案複製到target/docker/下;

二、構建執行

其中:第5,6行可以看到copy過程,對應pom.xml中的<resource>配置,剩下為從Dockerfile構建映象過程。

從以上看出此映象只有預設的tag:latest,如果需要加上版本資訊,需在pom.xml中新增如下配置:

或者

以上配置或手動新增tag後,最終映象如下:

三、推送映象到遠端倉庫阿里雲映象庫

1.建立倉庫

在阿里雲容器映象服務建立倉庫

2.mvn配置映象庫認證

3.pom.xml配置

注意:

(1)<imageName>名稱一定要與與阿里雲映象倉庫對應,否則無法push到阿里雲倉庫,功能等於:

(2)<serverId>一定要與mvn映象庫的id對應

以上兩項不對,映象將預設推送至docker.io。

4.構建並push

注意:

四、繫結Docker命令到Maven各個階段

Docker 構建過程為 build、tag、push,其中build、tag對應mvn的package階段,push對應mvn的deploy。透過將docker命令繫結到mvn的各個階段,我們可以透過mvn deploy實現構建並push的過程。

補充:

maven各階段功能:

(1)package階段實現專案編譯、單元測試、打包功能,但沒有把打好的可執行jar包(war包或其它形式的包)佈署到本地maven倉庫和遠端maven私服倉庫;

(2) install階段實現專案編譯、單元測試、打包功能,同時把打好的可執行jar包(war包或其它形式的包)佈署到本地maven倉庫,但沒有佈署到遠端maven私服倉庫;

(3) deploy階段實現專案編譯、單元測試、打包功能,同時把打好的可執行jar包(war包或其它形式的包)佈署到本地maven倉庫和遠端maven私服倉庫;

1.pom.xml配置外掛

注意:一定要透過maven-deploy-plugin設定skip,透過skip跳過artifact倉庫,否則mvn deploy 推送時報錯:

2.執行命令

注意:

(1)經測試發現,實際<goal>tag</goal>階段實際並不會進行tag,而是透過<imageName>registry.cn-qingdao.aliyuncs.com/test/test</imageName>配置進行tag,如果你的imageName設定不正確,則不會推送到自定義倉庫,而是預設的官方倉庫;

(2)此方式會將映象的所有tag 版本及歷史版本,如v3和latest及所有歷史版本v2,v1都會推送到遠端倉庫;

總結

透過對比,"docker命令繫結mvn各階段"方式不太靈活,而且會將映象所有tag進行推送,但提供了一套模板用於自動化流程,可根據實際情況選擇。

docker部署springboot的過程算是親自實踐了下,但是在實際過程中還需要考慮以下問題:

1.java應用的執行時資料、日誌檔案的持久化;

2.映象命令、目錄問題、私有映象庫等的配合使用;

3.流水線操作實現測試、版本釋出等;

4.docker 執行狀態監控等;

運維從來都不滿足於實現部署的某個過程,需要綜合考慮提供一套整體的運維方案,這個還需要不斷實踐總結。

來自 “ 木訥大叔愛運維 ”, 原文作者:木訥大叔愛運維;原文連結:https://mp.weixin.qq.com/s/-1f6UmbD8RxXDqfUvX97rg,如有侵權,請聯絡管理員刪除。

相關文章