k8s Java 專案替換 jar 中的 class 檔案

程序员多多發表於2024-04-24

背景

  • 緊急需求,客戶需要立馬上線
  • docker 包體積過大,遠端不穩定,檔案發不過去
  • 單點修改,風險低

步驟

1. 獲取 pod 所在宿主機 podonhost

kubectl -n $namespance get pods -owide | grep $podname | grep Running

2. 獲取 pod 的容器 cid

kubectl -n $namespance describe po $podname | grep "Container ID"

3. 進入pod 所在宿主機 podonhost 修改容器內容

將本地打包提取出 class,copy 到伺服器容器內

docker cp xxx.class $cid_short:/
docker exec -it $cid_short bash

4. 進入到 jar 所在目錄重新替換 jar 包

# 解壓 jar 包
jar -xvf xxx.jar
# 替換內容
cp /xxx.class BOOT_INF/class/
# 重新打 jar 包
jar -cfM0 xxx.jar ./
# 退出容器
exit

5. 重新打映象

docker commit $cid_short $image_path

6. 映象打包

docker push $image_path
# 如果沒有 docker 倉庫,可以選擇儲存 tar 包,copy 到 k8s 伺服器上
# docker save -0 1.tar $image_path
# docker load -i 1.tar

7. 更新映象

# 也可以修改 yaml 檔案的 image 版本
 kubectl -n  $namespance set image deployment/$deployment_name  $deployment_name= $image_path

結論

執行正常,修改生效,後續並整理了shell指令碼,簡化了操作

注意事項

  1. 這種方式打包出來的 docker 映象包含執行時檔案,不純淨
  2. 步驟4中 jar -cfM0 末尾的0不能省,否則會壓縮導致無法載入

相關文章