k8s Java 项目替换 jar 中的 class 文件

背景

  • 紧急需求,客户需要立马上线
  • 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不能省,否则会压缩导致无法加载
posted @   程序员多多  阅读(149)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示