Shell脚本-一键部署升级Docker

一键部署升级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

posted @ 2021-09-13 16:06  难删亦删  阅读(507)  评论(0)    收藏  举报