華為云鯤鵬服務(wù)器部署Java踩坑記

之前跟華為云的技術(shù)人員溝通,他們說在鯤鵬服務(wù)器上構(gòu)建部署對微軟的 dotNET 支持不是很好,建議使用 Java ,我們程序現(xiàn)在是混合模式 dotNET 和 Java 都有。讓我沒想到的是 dotNET 的構(gòu)建部署很順利,反倒是 Java 的部署遇到了些問題。
現(xiàn)象是 CCE 中的工作負載提示異常,應(yīng)用不能正常訪問,查看了容器日志,如下圖:

最終查出的原因是基礎(chǔ)鏡像使用錯誤,因之前跟華為技術(shù)人員溝通得知鯤鵬服務(wù)器只支持 openjdk ,并且鯤鵬服務(wù)器是 arm 芯片,所以就找到了 arm64v8/openjdk 的基礎(chǔ)鏡像,?arm64v8 下只有一個 openjdk 的鏡像,這個鏡像中的 Java version 是 17 ,我們使用的 Java 的版本是 8 ,就導(dǎo)致了不兼容。
正確在華為云鯤鵬服務(wù)器構(gòu)建一個 Java 的 Spring Boot 項目的步驟如下:
1、構(gòu)建一個基礎(chǔ)鏡像推送到華為云的私有鏡像倉庫,ssh 進入任意一臺 ECS 服務(wù)器,執(zhí)行下面命令:
docker?pull?adoptopenjdk/openjdk8
##?登錄鏡像倉庫
docker?login?-u?cn-north-4@89VUVGA2PF5XSHSM6YB4?-p?40d6f47154ef844717e9acc4cc3240e2dfeb900b149058e60a3f6fa598fb1?swr.cn-north-5.myhuaweicloud.com
docker?tag?adoptopenjdk/openjdk8??swr.cn-north-5.myhuaweicloud.com/xxx/openjdk:latest
docker?push?swr.cn-north-5.myhuaweicloud.com/xxx/openjdk:latest
注意:docker pull 的鏡像為 adoptopenjdk/openjdk8 ,這是 Java 8 的 openjdk 版本。值得一提的是這個鏡像并非是 arm 的鏡像,但依然可以用,只需要在創(chuàng)建構(gòu)建任務(wù)的時候,指定是鯤鵬服務(wù)器就可以。

2、創(chuàng)建一個 Spring Boot 項目,根目錄下創(chuàng)建 Dcokerfile 文件,內(nèi)容如下:
FROM?swr.cn-north-5.myhuaweicloud.com/xxx/openjdk:latest
ENV?PARAMS=""
ENV?TZ=PRC
ADD?Java-Test-SNAPSHOT.jar?/Java-Test-SNAPSHOT.jar
ENTRYPOINT?["sh","-c","java?-jar?/Java-Test-SNAPSHOT.jar??$PARAMS"]
3、創(chuàng)建構(gòu)建任務(wù),這一步驟可以參考《華為云服務(wù)器初探二(完結(jié))》中的描述;
4、在 CCE 中創(chuàng)建無狀態(tài)負載,需要手動添加環(huán)境變量 PARAMS ,如下圖:

如果直接使用 docker run 命令創(chuàng)建容器,命令如下:
docker?run?-d?-p?9214:9214?-e?PARAMS='--spring.profiles.active=dev?-server.port=9214'?--name?java-test??swr.cn-north-5.myhuaweicloud.com/xxx/openjdk:latest
可以看到上面 PARAMS 后面的值是加了單引號的,這個參數(shù)值在 CCE 的環(huán)境變量設(shè)置的時候需要去掉單引號,否則容器也不能正常啟動。
5、工作負載搞定,剩下的構(gòu)建、部署、流水線和前面文章中的類似。
最后的一點思考:
像我遇到的這種問題,為什么在官網(wǎng)文檔中沒有提及呢?我覺得一個重要的原因是,寫文檔的人存在知識的詛咒,會認為很多基礎(chǔ)知識大家應(yīng)該都會。出發(fā)點是自己的角度,而不是從用戶的角度。
我這篇文檔也是一樣,因為是踩坑記錄,所以已經(jīng)假設(shè)你在使用華為云鯤鵬服務(wù)器,并且能較熟練操作,否則可能也是一頭霧水。
但如果是寫一些基礎(chǔ)文檔或教程,還是要站在讀者(用戶)的角度去想,把他們當(dāng)成是小白,寫出的東西用處會更大。
相關(guān)閱讀:
