背景
- 紧急需求,客户需要立马上线
- 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不能省,否则会压缩导致无法加载