Shell脚本构建Docker 半自动化编译打包发布应用操作

Docker 发布的方式为实现DevOps(自动化运维,需要配置 代码管理工具如Git的hook来实现提交编译、打包、发布等一系列事件控制)提供了诸多方便,辅助于Shell脚本可以很好的配合起来。

Docker镜像可以通过自动化编译,也可以通过导入镜像的方式来获得。

本文的题目叫:Shell脚本构建Docker 半自动化编译打包发布,因为我这里还没跟代码管理关联起来。

Shell脚本不同实现

导入镜像方式(镜像文件rtvsweb-publish.tar):

构建发布方式(依靠Dockerfile来构建):

Shell Docker构建发布脚本工具核心install.sh

#! /bin/bash
##file:rtvs.sh
##company:cvnavi.com
##author:Pengjunlin
echo "当前执行文件......$0"
##################################变量定义##################################
DOCKER_IMAGE_IS_MATCH_TAR_FILE="false"
DOCKER_RTVSWEB_CONTAINER_NAME="rtvsweb-publish"
DOCKER_RTVSWEB_NEW_VERSION=""
DOCKER_RTVSWEB_FIRST_VERSION=1
DOCKER_RTVSWEB_SECOND_VERSION=0
DOCKER_RTVSWEB_THIRD_VERSION=0
DOCKER_RTVSWEB_VERSION_TAG=""
DOCKER_CONTAINER_TEMP_HOST=""
DB_REDIS_CONNECTION_STRING=""
DB_MYSQL_CONNECTION_STRING=""
DB_MYSQL_HOST=""
MASTER_LAN_IP=""
SYSTEM_ALLOW_TO_SET="false"
###################################函数定义#######################################
function init_files()
{
	# 创建rtvs目录
	if [[ ! -d "/usr/local/rtvs" ]]; then
		echo "创建容器映射路径.... /usr/local/rtvs"
		mkdir /usr/local/rtvs
	fi
	# 复制VersionConfig.xml(第一次做完全复制,若有变动需要手动修改)
	if [[ -f "./VersionConfig.xml" ]]; then
		if [[ ! -f "/usr/local/rtvs/VersionConfig.xml" ]]; then
			echo "拷贝一份XML配置文件: ./VersionConfig.xml /usr/local/rtvs/VersionConfig.xml"
			cp VersionConfig.xml /usr/local/rtvs/VersionConfig.xml
		fi
	else
		echo "缺少./VersionConfig.xml文件...已退出安装!"
		exit
	fi
	# 复制SettingConfig.xml(第一次做完全复制,若有变动需要手动修改)
	if [[ -f "./SettingConfig.xml" ]]; then
		if [[ ! -f "/usr/local/rtvs/SettingConfig.xml" ]]; then
			echo "拷贝一份XML配置文件: ./SettingConfig.xml /usr/local/rtvs/SettingConfig.xml"
			cp SettingConfig.xml /usr/local/rtvs/SettingConfig.xml
		fi
	else
		echo "缺少./SettingConfig.xml文件...已退出安装!"
		exit
	fi
	# 复制log4.config(第一次做完全复制,若有变动需要手动修改)
	if [[ -f "./log4.config" ]]; then
		if [[ ! -f "/usr/local/rtvs/log4.config" ]]; then
			echo "拷贝一份日志配置文件: ./log4.config /usr/local/rtvs/log4.config"
		  cp log4.config /usr/local/rtvs/log4.config
		fi
	else
		echo "缺少./log4.config文件...已退出安装!"
		exit
	fi
}
function mysql_create_table()
{
	if [[ -f "./mysql_create_table.sh" ]]; then
		echo "数据库脚本赋值权限......"
		# 为执行文件添加权限
		chmod a+x mysql_create_table.sh
	else
		echo "缺少./mysql_create_table.sh文件...已退出安装!"
	  exit
	fi
	# 执行mysql数据库表创建
	./mysql_create_table.sh
	if [[ $? -eq 0 ]]; then
		echo "./mysql_docker_install.sh 执行完成!"
	else
		exit
	fi
}

function docker_install()
{
	echo "检查Docker......"
	docker -v
  if [ $? -eq 0 ]; then
    echo "检查到Docker已安装!"
  else
  	echo "安装docker环境..."
    curl -sSL https://get.daocloud.io/docker | sh
    echo "安装docker环境...安装完成!"
  fi
  # 创建公用网络==bridge模式
  #docker network create share_network
}

function mysql_install(){
	install_type=$1

	if [[ "$install_type" == "by_local_mysql_installer" ]]; then
		#statements
		echo "暂不支持wget本地下载安装,已退出!"
		exit 1
	fi

	if [[ "$install_type" == "by_docker_mysql_installer" ]]; then
		#statements
		docker_mysql_install
	fi

	if [[ "$install_type" == "by_smart_installer" ]]; then
		#statements
		if [[ `netstat -lanp|grep tcp|grep 3306|wc -l` == 1 ]]; then
			echo "检测到mysql已在本机安装!"
			# 打印一下mysql版本
			echo "检测到mysql版本:"
			mysql --version
			# 执行创建Mysql数据库脚本
		  mysql_create_table
			if [[ $? -eq 0 ]]; then
				echo "本地MySQL脚本初始化完成!"
			else
				echo "本地MySQL脚本初始化失败!"
				exit 1
			fi
		  DB_MYSQL_HOST="localhost"
		else
			docker_mysql_install
		fi
	fi
}

function docker_mysql_install(){
	echo "安装Docker Mysql环境..."
	if [[ -f "./docker_mysql_install.sh" ]]; then
		if [[ -f "./docker_mysql_create_table.sh" ]]; then
			echo "拷贝一份容器执行文件: ./docker_mysql_create_table.sh /usr/local/docker_mysql_create_table.sh"
			cp docker_mysql_create_table.sh /usr/local/docker_mysql_create_table.sh
		else
			echo "缺少./docker_mysql_create_table.sh文件...已退出安装!"
		  exit 1
		fi
		# 为执行文件添加权限
		chmod a+x docker_mysql_install.sh
		# Dokcer方式安装Mysql
		./docker_mysql_install.sh
		if [[ $? -eq 0 ]]; then
			echo "./docker_mysql_install.sh 执行完成!"
			# 休10秒钟
			echo "休眠等待10s,等待Docker执行完成......"
			sleep 10s
			# 测试打印mysql信息
			print_docker_mysql_info
		else
			echo "./docker_mysql_install.sh 执行过程中出现错误,已退出安装!"
		  exit 1
		fi
	else
		  echo "缺少./docker_mysql_install.sh文件...已退出安装!"
		  exit 1
	fi
}

function docker_container_ip() {
  DOCKER_CONTAINER_TEMP_HOST=` docker inspect --format '{{ .NetworkSettings.IPAddress }}' $1`
}

function init_docker_master_ip(){
	out=0
	for i in `ip a |grep inet[^6]|grep -E -o '([0-9]{1,3}\.){3}[0-9]{1,3}'`; do
		OLD_IFS="$IFS"
		IFS="."
		arr=($i)
		IFS="$OLD_IFS"
		for s in ${arr[@]} ;do
			if [[ $s -eq "192" ]]; then
				 echo "$i"
				 MASTER_LAN_IP=$i
				 out=1
				 break
			fi
		done
		if [[ $out -eq 1 ]]; then
			break
		fi
	done
}

function print_docker_mysql_info()
{
	echo "脚本执行Mysql信息验证:..."
	if [[ -f "./docker_mysql_validator.sh" ]]; then
		echo "拷贝一份容器执行文件: ./docker_mysql_validator.sh /usr/local/docker_mysql_validator.sh"
		cp docker_mysql_validator.sh /usr/local/docker_mysql_validator.sh
	else
		echo "缺少./docker_mysql_validator.sh文件...已退出安装!"
		exit
 	fi

	# 映射copy文件路径到docker容器
	docker cp /usr/local/docker_mysql_validator.sh mysql5.7:/usr/local/docker_mysql_validator.sh

	docker exec -it mysql5.7 /bin/bash -c "sh /usr/local/docker_mysql_validator.sh"
	if [[ $? -eq 0 ]]; then
		echo "./docker_mysql_validator.sh 执行完成!"

		echo "MySQL容器Host:"
		docker_container_ip mysql5.7
		echo "当前mysql5.7实例IP=$DOCKER_CONTAINER_TEMP_HOST"
		#echo "MySQL容器network 相关信息:"
		#docker network inspect share_network
    #echo "MySQL容器link相关信息:"
		#cat /etc/hosts
	else
		echo "./docker_mysql_validator.sh 执行过程中出现错误,已退出安装!"
		exit
	fi
	#link 访问方式
	DB_MYSQL_HOST="mysql5.7"
}

function destory_docker_service()
{
	# 停止容器
	for i in [ `docker ps ` ]; do
		if [[ "$i" == "rtvsweb-publish" ]]; then
			echo "尝试停止$DOCKER_RTVSWEB_CONTAINER_NAME容器..."
		  docker stop $DOCKER_RTVSWEB_CONTAINER_NAME
		fi
	done
  # 删除容器
	for i in [ `docker ps -a` ]; do
		if [[ "$i" == "rtvsweb-publish" ]]; then
			echo "尝试删除$DOCKER_RTVSWEB_CONTAINER_NAME容器..."
		docker rm $DOCKER_RTVSWEB_CONTAINER_NAME
		fi
	done
}

function docker_build_image()
{
	# 清理容器(保留历史构建的镜像)
	destory_docker_service

	if [[ $? -eq 0 ]]; then
		echo "应用服务容器和镜像已处理,配置文件已完成复制!"
	else
		exit 1
	fi

	echo "Docker镜像构建......cmd:(docker build -t rtvsweb:$DOCKER_RTVSWEB_NEW_VERSION .)"
	docker build -t rtvsweb:$DOCKER_RTVSWEB_NEW_VERSION .

	# 判断是否有镜像,存在时创建相应的容器实例
	for i in [ `docker images` ]; do
		#statements
		if [[ "$i" == "$DOCKER_RTVSWEB_NEW_VERSION" ]]; then
			DOCKER_IMAGE_IS_MATCH_TAR_FILE="true"
			echo "已经找到最新构建的镜像!"
			run_docker_service_image
			break
		fi
	done
	if [[ $DOCKER_IMAGE_IS_MATCH_TAR_FILE == "false" ]]; then
		echo "构建镜像未匹配到最新版本,已退出安装!"
		exit 1
	fi

	echo "构建后的docker images镜像列表:"
	docker images

	echo "当前正在运行的Docker容器实例列表:"
	docker ps
}

function run_docker_service_image()
{
	echo "正在启动docker 服务容器......"
	# run 的参数设置参考VS项目启动的设置--privileged=true 获取管理员权限
	# ===bridge 桥接模式
	#docker run -it --name=$DOCKER_RTVSWEB_CONTAINER_NAME --net="bridge" --dns 8.8.8.8 --network share_network --network-alias $4 -v /usr/local/rtvs/error_log:/app/Error_log -v /usr/local/rtvs/log_file:/app/LogFile -v /usr/local/rtvs/mydata:/MyData -v /usr/local/rtvs/videocache:/MyVideo -v /usr/local/rtvs/SettingConfig.xml:/app/SettingConfig.xml -p 38067:80 -p 44383:443 -p 18000:18000 -p 18002:18002 -p 19700:19700 -p 19702:19702 -p 19703:19703 -d $DOCKER_RTVSWEB_IMAGE_TAG_NAME
	if [[ $DB_MYSQL_HOST == "mysql5.7" ]]; then
		# ===link 链接模式
		echo "rtvsweb--容器运行---链接模式"
		docker run -it --name $DOCKER_RTVSWEB_CONTAINER_NAME --privileged=true --link mysql5.7:mysql5.7 -v /usr/local/rtvs:/MyData -e MyDataPath=/MyData -p 38067:80 -p 44383:443 -p 18000:18000 -p 18002:18002 -p 19700-19719:19700-19719 -p 30888-30889:30888-30889 -d rtvsweb:$DOCKER_RTVSWEB_NEW_VERSION
	else
		# ===普通模式
		echo "rtvsweb--容器运行---普通模式"
		docker run -it --name $DOCKER_RTVSWEB_CONTAINER_NAME --privileged=true -v /usr/local/rtvs:/MyData -e MyDataPath=/MyData -p 38067:80 -p 44383:443 -p 18000:18000 -p 18002:18002 -p 19700-19719:19700-19719 -p 30888-30889:30888-30889 -d rtvsweb:$DOCKER_RTVSWEB_NEW_VERSION
	fi
}

####################工具类和流程定制################################

function editXml()
{
  val=`echo ${@:3}`
  echo "正在修改XML文件:$1...."
  echo "正在修改XML文件:[0]=$1,[1]=$2,[2]=$val"
  echo "XML文件$2标签 value=$val"
  sed -i "s/<$2>.*<\/$2>/<$2>${val}<\/$2></g" $1
}

function init_mysql_conn()
{
	if [[ "$DB_MYSQL_HOST" == "localhost" ]]; then
		mysql="Database=filecache;Data Source=$MASTER_LAN_IP;port=3366;User Id=rtvsweb;Password=rtvs2018;charset=utf8;pooling=true"
		sed -i "s/<MysqlConnectionString>.*<\/MysqlConnectionString>/<MysqlConnectionString>$mysql<\/MysqlConnectionString>/g" /usr/local/rtvs/SettingConfig.xml
	  DB_MYSQL_CONNECTION_STRING=`grep -E -o -e '<MysqlConnectionString>.+</MysqlConnectionString>' /usr/local/rtvs/SettingConfig.xml | sed 's/<MysqlConnectionString>//g'|sed 's/<\/MysqlConnectionString>//g'`
	else
		mysql="Database=filecache;Data Source=mysql5.7;port=3306;User Id=rtvsweb;Password=rtvs2018;charset=utf8;pooling=true"
		sed -i "s/<MysqlConnectionString>.*<\/MysqlConnectionString>/<MysqlConnectionString>$mysql<\/MysqlConnectionString>/g" /usr/local/rtvs/SettingConfig.xml
	  DB_MYSQL_CONNECTION_STRING=`grep -E -o -e '<MysqlConnectionString>.+</MysqlConnectionString>' /usr/local/rtvs/SettingConfig.xml | sed 's/<MysqlConnectionString>//g'|sed 's/<\/MysqlConnectionString>//g'`
	fi
} 

function editSpecificConfig()
{
  init_mysql_conn
	echo "获取/usr/local/rtvs/SettingConfig.xml信息..."
	cat /usr/local/rtvs/SettingConfig.xml

  # 判断是否可以设置
	if [[ "$SYSTEM_ALLOW_TO_SET" == "true" ]]; then
		read -p ">>>是否修改Redis配置连接字符串?y/n:" ans
		echo "$ans"
		if [[ "$ans" == "y" ]]; then
			read -p "请输入Redis配置连接字符串:" redis
			echo "新的Redis连接字符串:$redis"
	    sed -i "s/<RedisExchangeHosts>.*<\/RedisExchangeHosts>/<RedisExchangeHosts>$redis<\/RedisExchangeHosts>/g" /usr/local/rtvs/SettingConfig.xml
			DB_REDIS_CONNECTION_STRING=`grep -E -o -e '<RedisExchangeHosts>.+</RedisExchangeHosts>' /usr/local/rtvs/SettingConfig.xml | sed 's/<RedisExchangeHosts>//g'|sed 's/<\/RedisExchangeHosts>//g'`
			echo "获取已修改的Redis配置连接字符串...RedisExchangeHosts=$DB_REDIS_CONNECTION_STRING"
		fi

		read -p ">>>是否修改Mysql配置连接字符串?y/n:" ans
		echo "$ans"
		if [[ "$ans" == "y" ]]; then
			read -p "请输入Mysql配置连接字符串:" mysql
			echo "新的Mysql连接字符串:$mysql"
	    sed -i "s/<MysqlConnectionString>.*<\/MysqlConnectionString>/<MysqlConnectionString>$mysql<\/MysqlConnectionString>/g" /usr/local/rtvs/SettingConfig.xml
			DB_MYSQL_CONNECTION_STRING=`grep -E -o -e '<MysqlConnectionString>.+</MysqlConnectionString>' /usr/local/rtvs/SettingConfig.xml | sed 's/<MysqlConnectionString>//g'|sed 's/<\/MysqlConnectionString>//g'`
			echo "获取已修改的Mysql配置连接字符串...MysqlConnectionString=$DB_MYSQL_CONNECTION_STRING"
		fi
	fi
}

function remoteRedisAndMysqlConfig()
{

	echo "获取/usr/local/rtvs/SettingConfig.xml信息..."
	cat /usr/local/rtvs/SettingConfig.xml
	# 设置Redis连接字符串
	read -p "是否修改Redis配置连接字符串?y/n:" ans
	echo "$ans"
	if [[ "$ans" == "y" ]]; then
		read -p "请输入Redis连接字符串:" redis
		echo "新的Redis连接字符串:$redis"
		sed -i "s/<RedisExchangeHosts>.*<\/RedisExchangeHosts>/<RedisExchangeHosts>$redis<\/RedisExchangeHosts>/g" /usr/local/rtvs/SettingConfig.xml
		DB_REDIS_CONNECTION_STRING=`grep -E -o -e '<RedisExchangeHosts>.+</RedisExchangeHosts>' /usr/local/rtvs/SettingConfig.xml | sed 's/<RedisExchangeHosts>//g'|sed 's/<\/RedisExchangeHosts>//g'`
		echo "获取已修改的Redis配置连接字符串...RedisExchangeHosts=$DB_REDIS_CONNECTION_STRING"
	fi

	read -p "是否修改Mysql配置连接字符串?y/n:" ans
	echo "$ans"
	if [[ "$ans" == "y" ]]; then
		read -p "请输入Mysql连接字符串:" mysql
		echo "新的Mysql连接字符串:$mysql"
		sed -i "s/<MysqlConnectionString>.*<\/MysqlConnectionString>/<MysqlConnectionString>$mysql<\/MysqlConnectionString>/g" /usr/local/rtvs/SettingConfig.xml
		DB_MYSQL_CONNECTION_STRING=`grep -E -o -e '<MysqlConnectionString>.+</MysqlConnectionString>' /usr/local/rtvs/SettingConfig.xml | sed 's/<MysqlConnectionString>//g'|sed 's/<\/MysqlConnectionString>//g'`
		echo "获取已修改的Mysql配置连接字符串...MysqlConnectionString=$DB_MYSQL_CONNECTION_STRING"
	fi

}

function help()
{
	echo "*******************************************"
	echo "*********    调用方法说明  ************"
	echo "*******************************************"
	echo "查看核心配置文件:cat ./SettingConfig.xml"
	echo "帮助方法说明:sh ./install.sh help"
	echo "修改Redis和MySQL连接字符串:sh ./install.sh editXml [XMLFilePath] [tag] ['value'] "
  echo "********************************************"
	echo "*********    快速定制安装  *************"
	echo "********************************************"
	echo "1、执行本地Mysql安装(wget下载文件安装...比较费时): sh ./install.sh by_local_mysql_installer"
	echo "2、执行Docker Mysql安装 : sh ./install.sh by_docker_mysql_installer"
	echo "3、智能检测决定Mysql安装方式(如果本机已有MySQL则直接使用): sh ./install.sh by_smart_installer"
	echo "4、简化安装只需要给出Redis和MySQL连接字符串即可(极简方式): sh ./install.sh by_simple_installer"
	echo "说明:\r 以上4种方式已包含了Docker应用的安装!"
}

function completed()
{
	echo "******************安装结果:*****************"
	# bridge 桥接模式
	#echo "network实例, share_network相关容器信息:"
	#docker network inspect share_network
	version_step=1

  # 记录下一次版本号
	if [[ "$DOCKER_RTVSWEB_VERSION_TAG" == "VersionFirst" ]]; then
		DOCKER_RTVSWEB_FIRST_VERSION=$((DOCKER_RTVSWEB_FIRST_VERSION+version_step))
		sed -i "s/<VersionFirst>.*<\/VersionFirst>/<VersionFirst>$DOCKER_RTVSWEB_FIRST_VERSION<\/VersionFirst>/g" /usr/local/rtvs/VersionConfig.xml
		sed -i "s/<VersionSecond>.*<\/VersionSecond>/<VersionSecond>0<\/VersionSecond>/g" /usr/local/rtvs/VersionConfig.xml
		sed -i "s/<VersionThird>.*<\/VersionThird>/<VersionThird>0<\/VersionThird>/g" /usr/local/rtvs/VersionConfig.xml
	fi
	if [[ "$DOCKER_RTVSWEB_VERSION_TAG" == "VersionSecond" ]]; then
		DOCKER_RTVSWEB_SECOND_VERSION=$((DOCKER_RTVSWEB_SECOND_VERSION+version_step))
		sed -i "s/<VersionSecond>.*<\/VersionSecond>/<VersionSecond>$DOCKER_RTVSWEB_SECOND_VERSION<\/VersionSecond>/g" /usr/local/rtvs/VersionConfig.xml
		sed -i "s/<VersionThird>.*<\/VersionThird>/<VersionThird>0<\/VersionThird>/g" /usr/local/rtvs/VersionConfig.xml
	fi
	if [[ "$DOCKER_RTVSWEB_VERSION_TAG" == "VersionThird" ]]; then
		DOCKER_RTVSWEB_THIRD_VERSION=$((DOCKER_RTVSWEB_THIRD_VERSION+version_step))
		sed -i "s/<VersionThird>.*<\/VersionThird>/<VersionThird>$DOCKER_RTVSWEB_THIRD_VERSION<\/VersionThird>/g" /usr/local/rtvs/VersionConfig.xml
	fi

	VIDEO_CACHE_PATH=`grep -E -o -e '<VideoCachePath>.+</VideoCachePath>' /usr/local/rtvs/SettingConfig.xml | sed 's/<VideoCachePath>//g'|sed 's/<\/VideoCachePath>//g'`
	DB_REDIS_CONNECTION_STRING=`grep -E -o -e '<RedisExchangeHosts>.+</RedisExchangeHosts>' /usr/local/rtvs/SettingConfig.xml | sed 's/<RedisExchangeHosts>//g'|sed 's/<\/RedisExchangeHosts>//g'`
	DB_MYSQL_CONNECTION_STRING=`grep -E -o -e '<MysqlConnectionString>.+</MysqlConnectionString>' /usr/local/rtvs/SettingConfig.xml | sed 's/<MysqlConnectionString>//g'|sed 's/<\/MysqlConnectionString>//g'`

	echo "Redis连接字符串:$DB_REDIS_CONNECTION_STRING"
	echo "Mysql连接字符串:$DB_MYSQL_CONNECTION_STRING"
	echo "默认视频缓存目录:$VIDEO_CACHE_PATH"
	echo "正在运行的容器实例:"
	docker ps
  echo "容器对应的Ip地址:"
  docker_container_ip mysql5.7
  if [[ "$DOCKER_CONTAINER_TEMP_HOST" != "" ]]; then
    echo "mysql5.7   ---------------------$DOCKER_CONTAINER_TEMP_HOST"
  fi
  docker_container_ip $DOCKER_RTVSWEB_CONTAINER_NAME
  echo "$DOCKER_RTVSWEB_CONTAINER_NAME ---------------------$DOCKER_CONTAINER_TEMP_HOST"
  echo "验证rtvs访问:curl http://cvtsp.com:38067/"
	echo "******************安装完成!*****************"
}

function version_management()
{
  DOCKER_RTVSWEB_FIRST_VERSION=`grep -E -o -e '<VersionFirst>.+</VersionFirst>' /usr/local/rtvs/VersionConfig.xml | sed 's/<VersionFirst>//g'|sed 's/<\/VersionFirst>//g'`
	DOCKER_RTVSWEB_SECOND_VERSION=`grep -E -o -e '<VersionSecond>.+</VersionSecond>' /usr/local/rtvs/VersionConfig.xml | sed 's/<VersionSecond>//g'|sed 's/<\/VersionSecond>//g'`
	DOCKER_RTVSWEB_THIRD_VERSION=`grep -E -o -e '<VersionThird>.+</VersionThird>' /usr/local/rtvs/VersionConfig.xml | sed 's/<VersionThird>//g'|sed 's/<\/VersionThird>//g'`
	DOCKER_RTVSWEB_VERSION_TAG=`grep -E -o -e '<UpgradeTag>.+</UpgradeTag>' /usr/local/rtvs/VersionConfig.xml | sed 's/<UpgradeTag>//g'|sed 's/<\/UpgradeTag>//g'`

	DOCKER_RTVSWEB_NEW_VERSION="$DOCKER_RTVSWEB_FIRST_VERSION.$DOCKER_RTVSWEB_SECOND_VERSION.$DOCKER_RTVSWEB_THIRD_VERSION"
  echo "当前rtvsweb版本:$DOCKER_RTVSWEB_NEW_VERSION"
  echo "当前rtvsweb版本升级格式:$DOCKER_RTVSWEB_VERSION_TAG"
}

function by_local_mysql_installer()
{
	# Docker 安装
  docker_install
  # Mysql 安装及其脚本创建
  mysql_install "by_local_mysql_installer"
  # 镜像构建
  if [[ $? -eq 0 ]]; then
		docker_build_image
		if [[ $? -eq 0 ]]; then
			echo "镜像构建成功!"
		else
			echo "镜像构建失败!"
			exit
		fi
  else
		exit
  fi
  # 修改镜像使用的路径和数据源
  editSpecificConfig
  # 完成后输出
  completed
}

function by_docker_mysql_installer()
{
  # Docker 安装
  docker_install
  # Mysql 安装及其脚本创建
  mysql_install "by_docker_mysql_installer"
  # 镜像构建
  if [[ $? -eq 0 ]]; then
		docker_build_image
		if [[ $? -eq 0 ]]; then
			echo "镜像构建成功!"
		else
			echo "镜像构建失败!"
			exit
		fi
	else
		exit
  fi
  # 修改镜像使用的路径和数据源
  editSpecificConfig
  # 完成后输出
  completed
}

function by_smart_installer()
{
  # Docker 安装
  docker_install
  # Mysql 安装及其脚本创建
  mysql_install "by_smart_installer"
  # 镜像构建
  if [[ $? -eq 0 ]]; then
		docker_build_image
		if [[ $? -eq 0 ]]; then
			echo "镜像构建成功!"
		else
			echo "镜像构建失败!"
			exit
		fi
  else
		exit
  fi
  # 修改镜像使用的路径和数据源
  editSpecificConfig
  # 完成后输出
  completed
}

function by_simple_installer()
{
  # Docker 安装
  docker_install
  # 镜像构建
  docker_build_image
  if [[ $? -eq 0 ]]; then
		echo "镜像构建成功!"
	else
		echo "镜像构建失败!"
		exit
	fi
  # 修改镜像使用的路径和数据源
  remoteRedisAndMysqlConfig
  # 完成后输出
  completed
} 

if [[ $# -gt 0 ]]; then
	echo "安装所需文件检查...."
	init_files
	if [[ $? -eq 0 ]]; then
		echo "安装Docker服务的文件存在,验证通过!"
	else
		echo "安装Docker服务的文件存在缺失,已退出安装!"
		exit
	fi

  echo "rtvsweb版本检查...."
  version_management
  echo "获取本地局域网IP地址...."
	init_docker_master_ip
	echo "本地IP地址....MASTER_LAN_IP=$MASTER_LAN_IP"
	#statements
	if [[ "$1" == "by_local_mysql_installer" ]]; then
		#statements
		by_local_mysql_installer
	fi
	if [[ "$1" == "by_docker_mysql_installer" ]]; then
		#statements
		by_docker_mysql_installer
	fi
	if [[ "$1" == "by_smart_installer" ]]; then
		#statements
		by_smart_installer
	fi
	if [[ "$1" == "by_simple_installer" ]]; then
		#statements
		by_simple_installer
	fi
	if [[ "$1" == "editXml" ]]; then

		if [[ $# -eq 4 ]]; then
			#statements
			editXml $2 $3 $4
		else
			echo "editXml参数个数不匹配!"

	  fi
	fi
	if [[ "$1" == "help" ]]; then
		#statements
		help
	fi
else
	help
fi

整体设计实现思路

1、Docker环境准备和安装

2、MySQL环境准备和安装

3、Docker的知识:构建、运行

4、Docker镜像的版本管理

5、容期间网络访问:--link

6、镜像打包历史

7、服务运行效果

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • 如何监控docker容器运行状态 shell 脚本

    场景 公司项目部署在docker中,由于未知原因容器偶尔会停止,需要写一个脚本监控 容器运行状态,如果容器停止了,就再启动该容器 shell脚本 #!/bin/bash # 传入容器名称 containerName=$1 currTime=`date +"%Y-%m-%d %H:%M:%S"` # 查看进程是否存在 exist=`docker inspect --format '{{.State.Running}}' ${containerName}` if [ "${exi

  • 在宿主机上执行docker容器内部的shell或程序方式

    为了避免反复进入docker容器内部操作,可以将一系列容器内部的指令由宿主机来操作完成. 在宿主机(作者主机为windows7)上执行centos容器(name为centos-1)中/usr目录下的"printer"可执行程序,该程序输出为打印"123". C:\Users\Administrator>docker exec -it centos-1 /bin/bash -c "cd usr && ./printer" 12

  • 详解Shell脚本控制docker容器启动顺序

    1.遇到的问题 在分布式项目部署的过程中,经常要求服务器重启之后,应用(包括数据库)能够自动恢复使用.虽然使用docker update --restart=always containerid能够让容器自动随docker启动,但是并不能保证是在数据库启动之后启动,如果数据库未启动,那么将导致应用启动失败;网上还有一种解决方法是通过docker-compose容器编排来控制启动顺序,这个博主研究的比较少. 2.解决思路 使用Shell脚本来控制,思路大致如下 探测数据库端口来检验数据库是否启动成

  • 使用Shell脚本批量启停Docker服务

    最近日常测试中经常需要手动启动或停止docker,于是决定写一个Shell脚本来代替人工操作,另外该脚本,也可以通过Python脚本实行远程调用,详细如下所示: 目前该脚本是将Container ID写死在脚本中,当然也可以通过传参给脚本来进行控制,大家可以改造一下. 启动docker 启动脚本详细如下所示: #!/bin/bash containerIDs="ad3e4d7fc407 a228730a915f ad3e4d7fc4099" statusLived="live

  • 在docker中执行linux shell命令的操作

    在docker中执行shell命令,需要在命令前增加sh -c,例如: docker run ubuntu sh -c 'cat /data/a.txt > b.txt' 否则,指令无法被正常解析. 补充:[Docker应用] docker中执行指定脚本(docker 下运行springboot应用) [Docker应用] docker中执行指定脚本 这里是执行spring boot的应用的实例: 1. 制作执行sh脚本的镜像文件(模板) Dockfile FROM vertigomedia/u

  • docker 实现容器与宿主机无缝调用shell命令

    如下所示: nsenter -t 1 -m -u -n -i sh -c "echo hello world! " docker容器加上privilege权限, 设置pid: "host" 补充:在宿主机执行docker容器中的shell脚本或命令 常见命令形式: docker exec -it master /bin/bash -c 'echo $PATH' docker exec -it master /bin/bash -c 'cd /home/bigdata

  • Shell脚本构建Docker 半自动化编译打包发布应用操作

    Docker 发布的方式为实现DevOps(自动化运维,需要配置 代码管理工具如Git的hook来实现提交编译.打包.发布等一系列事件控制)提供了诸多方便,辅助于Shell脚本可以很好的配合起来. Docker镜像可以通过自动化编译,也可以通过导入镜像的方式来获得. 本文的题目叫:Shell脚本构建Docker 半自动化编译打包发布,因为我这里还没跟代码管理关联起来. Shell脚本不同实现 导入镜像方式(镜像文件rtvsweb-publish.tar): 构建发布方式(依靠Dockerfile

  • Jenkins+Docker 一键自动化部署 SpringBoot 项目的详细步骤

    目录 Jenkins+Docker 一键自动化部署 SpringBoot 项目 一.安装docker 1.确保 yum 包更新到最新 2.卸载旧版本(如果安装过旧版本的话) 3.安装需要的软件包 4.设置yum源 5.安装docker 6.启动和开机启动 7.验证安装是否成功 二.安装Jenkins 1.安装Jenkins 2.初始化Jenkins 2.1 解锁Jenkins 2.2 安装插件 2.3 创建管理员用户 三.系统配置 1. 安装需要插件 2. 配置Maven 四.创建任务 1. 新

  • 详解在linxu下Svn一键安装shell脚本

    #!/bin/bash #下载svn yum -y install subversion #阿里云oss资料 wget -P /root https://babyrita.oss-cn-beijing.aliyuncs.com/lnmp/quyeweb/ziliao.zip #解压资料文件 unzip ziliao.zip #新建svndata目录 mkdir /home/svndata #svn服务器监听 默认3690端口 svnserve -d -r /home/svndata #创建svn

  • 使用Docker部署打包发布springboot项目

    目录 前言 第一:环境 第二:开始描述从搞项目到docker发布: 第四:各种错误教训集合. 前言 从安装docker到多种方式打包发布,编译,镜像,容器等问题,遇到种种问题,终于不负所望,一步步解决,本文我会比较大跨度的来说明一切解决办法. 第一:环境 1.虚拟机安装的centos7. 2.docker已安装好,不会的可以参看我的docker安装文章. 3.搞一个很简单的springboot项目即可,先搞定发布编译再说. 第二:开始描述从搞项目到docker发布: 1.springboot项目

  • 基于C++自动化编译工具的使用详解

    @echo off  title=HYTradingGateway自动化编译打包工具mode con cols=80 lines=40echo -------------------------------------------------------------echo 使用说明echo.                                                             echo HYTradingGateway自动化编译打包工具.修改echo 使用前提

  • 对Shell 脚本加密的方法

    用shell脚本对系统进行自动化维护,简单,便捷而且可移植性好. 但shell脚本是可读写的,很有可能会泄露敏感信息,如用户名,密码,路径,IP等. 同样,在shell脚本运行时会也泄露敏感信息. shc是一个加密shell脚本的工具.它的作用是把shell脚本转换为一个可执行的二进制文件. 这就很好的解决了上述问题. shc 安装 yum -y install shc 使用方法: shc -r -f script-name 注意:要有-r选项, -f 后跟要加密的脚本名. 运行后会生成两个文件

  • 如何使用Shell脚本掩盖Linux服务器上的操作痕迹(推荐)

    使用Shell脚本在Linux服务器上能够控制.毁坏或者获取任何东西,通过一些巧妙的攻击方法黑客可能会获取巨大的价值,但大多数攻击也留下踪迹.当然,这些踪迹也可通过Shell脚本等方法来隐藏. 寻找攻击证据就从攻击者留下的这些痕迹开始,如文件的修改日期.每一个 Linux 文件系统中的每个文件都保存着修改日期.系统管理员发现文件的最近修改时间,便提示他们系统受到攻击,采取行动锁定系统.然而幸运的是,修改时间不是绝对可靠的记录,修改时间本身可以被欺骗或修改,通过编写 Shell 脚本,攻击者可将备

  • 如何使用 Shell 脚本执行 .NET Core 应用

    在本文中,我将研究如何创建 shell 脚本来运行简单的 .NET Core 应用程序.之所以有这个研究议题,是因为本站(pzy.io)数据库需要每天定时备份,并在备份完成后,将备份文件上传远程云存储,保证了数据安全.由于数据库备份是 shell 脚本执行,而备份文件上传功能基于 .NET Core 开发,在备份完成后,shell 脚本需要调用 .NET Core 应用程序. 具体操作执行步骤很简单. 1.创建一个基本的 .NET Core 控制台应用程序,这个我已经建好了,如下示例: clas

  • shell脚本加密工具shc使用详解

    shell脚本加密工具shc shc是一个加密shell脚本的工具.它的作用是把shell脚本转换为一个可执行的二进制文件. 应用场景 用shell脚本对系统进行自动化维护,简单,便捷而且可移植性好.但shell脚本是可读写的,很有可能会泄露敏感信息,如用户名,密码,路径,IP等. 对于脚本中含有一些敏感信息的,通常我们都想做成二进制程序,不让用户看到源码,对于有这种需求的通常我们一般采用shc或者gzexe,我个人还是比较推荐shc. shc 安装 和使用 yum -y install shc

随机推荐