一键部署升级Docker
# 一键部署升级Docker
#!/bin/bash
#echo "step1:载入基础数据配置..."
dates=`date +"%Y%m%d%H%M"`
# 一、将需要做的不同的事,定义到函数中
# 1)基础数据配置
# 项目
projects=("test")
# 项目地址
urls=""
# -数据库账号
database_user="root"
# -数据库密码
database_passwd=""
# -数据库服务器
database_server=""
# -数据库备份/更新
databases=("")
# -服务器更新目录
update_dir="/data/update"
# -服务器备份目录
bak_dir="/data/bak"
# -服务器应用配置目录
gx_ccms_conf=""
# -数据库脚本
sql_file="$update_dir/sql/"
# -配置文件
conf_file="$update_dir/conf/config.properties"
# -docker镜像文件
images_file="$update_dir/images"
#echo "step1:载入基础数据配置√"
# 2)备份配置文件
bakConf(){
echo "####开始备份配置文件..."
cp $gx_ccms_conf/config.properties $bak_dir/
echo "备份配置文件√"
}
# 3)备份数据库
bakSql(){
echo "####开始备份数据库..."
date1=`date +"%Y%m%d%H%M"`
mkdir -p $bak_dir/${date1}bak
for i in $databases;
do
mysqldump -u$database_user -p$database_passwd -h$database_server $i > $bak_dir/${date1}bak/${i}_$date1.sql
if test $? -eq 0
then
echo "备份数据库√"
else
echo "备份数据库失败"
exit 1
fi
done
}
# 4)更新数据库
updateSql(){
echo "####开始更新数据库..."
mysql -u$database_user -p$database_passwd -h$database_server ${databases[0]} <$sql_file
echo "更新数据库√"
}
# 5)更新配置文件
updateConf(){
echo "####开始更新配置文件..."
mv $gx_ccms_conf/config.properties $gx_ccms_conf/config.properties.$dates
# -全量替换情况:
cp $conf_file $gx_ccms_conf/
# -新增某行/多行配置情况:
cat $gx_ccms_conf/config2.properties|akw '{print $1}' >> $gx_ccms_conf/config.properties
sed '1a copyright.path=/opt/product/data/files/copyright' $gx_ccms_conf/config.properties
# -修改某行/多行配置情况:
sed 's/aa/bb/g' $gx_ccms_conf/config.properties
# -删除某行/多行配置情况:
sed '1d' $gx_ccms_conf/config.properties
sed '2,$d' $gx_ccms_conf/config.properties
echo "更新配置文件√"
}
# 6)应用更新
updateApp(){
echo "####开始应用更新"
echo "0)载入目录所有镜像"
ls -l $image_path | sed '1d'|awk -F '[ ]+' '{print $9}' > /data/update/images$dates.txt
##
echo "1)载入镜像并获取镜像id"
## 添加for循环
for
image_id=`docker load < $images_file/ |awk 'END{print}'|awk '{print $4}'`
echo "2)打镜像tag"
docker tag $image_id ${projects[0]}:$dates
echo "3)获取老容器id"
container_id=`docker ps|grep ${projects[0]}|awk '{print $1}'`
echo "4)停止老容器"
docker stop $container_id
echo "5)根据镜像,启动一个新容器"
docker run --name=${projects[0]}$dates -d -ti -p 47020:8080 -v /opt/product/data/gx_ccms:/opt/product/data -v /data/jdk:/data/jdk ${projects[0]}:$dates
echo "6)休眠10s,检查新容器是否能够正常访问"
sleep 10s
response_code=`curl -is $urls|awk 'NR==1'|awk '{print $2}'`
if test $response_code == 200
then
echo "7)新容器启动成功"
else
echo "7)新容器启动失败"
fi
}
# 二、与用户交互
# 提示
echo "============================="
echo "【1】只备份数据"
echo "【2】只更新配置"
echo "【3】只更新数据"
echo "【4】只更新应用"
echo "【5】配置+数据+应用更新"
echo "【6】备份&更新"
echo "============================="
# 提示用户,并拿到用户指定的参数
read -p "请输入数字执行操作:" nums
# 根据用户指定的参数去判断,执行不同的方法
if test $nums == 1
then
##只备份数据##
bakConf
bakSql
elif [ $nums == 2 ]
then
##只更新配置##
updateConf
elif [ $nums == 3 ]
then
##只更新数据##
updateSql
elif [ $nums == 4 ]
then
##只更新应用##
updateApp
elif [ $nums == 5 ]
then
##配置+数据+应用更新##
updateConf
updateSql
updateApp
elif [ $nums == 6 ]
then
##备份&更新##
bakConf
bakSql
updateConf
updateSql
updateApp
else
echo "输入错误,请重新执行脚本!";
fi