背景
- 緊急需求,客戶需要立馬上線
- 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指令碼,簡化了操作
注意事項
- 這種方式打包出來的 docker 映象包含執行時檔案,不純淨
- 步驟4中 jar -cfM0 末尾的0不能省,否則會壓縮導致無法載入