前言:
看过前两天文章的同学应该知道,这两天正常工作的同时也在并行处理产品主线中出现的相同问题,主线产品已经在全国上百个局点使用过,并且有的局点已经打过其它的补丁,所有一直在梳理出一个通用补丁,并且不会因为不同局点的不同基线版本导致的补丁重出问题,补丁的主要功能已经基本实现,通过java attach热加载的方式实现,但是基于方便别人就是方便自己的原则(注:公司各个局点的产品都是由各个办事处的一线人员维护,安防公司一般都是办事处多,局点多,局点问题也多),今天简单写了一个shell脚本用于一键部署功能,也便于一线人员实施补丁,shell脚本的思路简单分享一下,具体发布的脚本明天去公司再完善一下;

注:处理局点问题很磨人,比较紧急的情况需要24h待命;

产品环境:centos + docker + jdk1.8

分析思路:

补丁的脚本是位于宿主机上,业务程序位于docker容器内,宿主机上的脚本会把补丁包替换到docker容器内,并执行attach.jar程序,重写业务程序publicserver.jar服务上的问题类,当前的问题不涉及程序配置文件的修改;

实现详情:

1)宿主机补丁结构:

是部署到宿主机上的

宿主机执行docker的命令 docker执行宿主机shell_docker


patch.sh脚本:

#!/bin/bash
echo "第一步:查询容器id"
containerId=$(docker ps -aqf "name=mycentos")
echo "容器id为:$containerId"
echo "第二步:拷贝attach至容器内"
docker cp patchAgent "mycentos":/home/
echo "attach拷贝到容器mycentos成功!"
echo "第三步:执行补丁包attach"
#startJar="nohup java -jar /home/patchAgent/testDemo.jar >./start.log 2>&1 &"
docker exec -it ${containerId} /bin/bash -c "cd /home/patchAgent && chmod u+x start.sh && sh start.sh"
#docker exec -it "mycentos" /bin/bash
echo "补丁执行成功!"

2)docker容器内attach补丁结构:

是部署到容器内部的,patchAgent补丁目录的部署是通过宿主机上的shell脚本copy到容器内的;

宿主机执行docker的命令 docker执行宿主机shell_java_02


start.sh脚本是用于启动attach.jar补丁的

start.sh脚本:

#!/bin/bash
nohup java -jar /home/patchAgent/testDemo.jar >./start.log 2>&1 &

执行结果:

1)宿主机

宿主机执行docker的命令 docker执行宿主机shell_jar_03


2)容器内attach.jar程序已运行

宿主机执行docker的命令 docker执行宿主机shell_宿主机执行docker的命令_04

遇到的问题:

在梳理过程中,也遇到一些问题,主要是shell脚本格式的问题,这里总结分享一下!!!

运行脚本是报 line 1: #!/bin/bash: No such file or directory

linux转换.sh脚本格式方式:

  1. 安装格式转换工具:yum install dos2unix -y
  2. 格式转换: dos2unix start.sh
  3. 再次运行 sh start.sh 脚本执行正常

window转换.sh格式:

windows下可以直接使用notepad++进行转换。

点击菜单栏的编辑->文档格式转换->转换为UNIX格式,完成转换。

宿主机执行docker的命令 docker执行宿主机shell_jar_05

=注:通过界面实现补丁已经升级功能,后续有时间再整理=