网关Docker部署脚本

119 阅读3分钟

解释器

#!/bin/bash

#!/bin/bash : 主要用于指定解释器

  • Shell 既是一种脚本编程语言,也是一个连接内核和用户的软件
  • 通过 cat 命令来查看当前 Linux 系统的可用 Shell
  • sh 是 UNIX 上的标准 shell,sh 是第一个流行的 Shell
  • bash保持了对sh的兼容性,是各种 Linux 发行版默认配置的 shell
[root@localhost home]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh

echo

用于字符串的输出

-e 开启转义

#!/bin/bash
echo -e "OK \n"  # -e 开启转义 \n 换行 \c 不换行
echo "test"

变量

中间不能有空格,可以使用下划线 _

使用变量 需要加上$

()() 与 {}

  • $() 命令替换
CURRENT=$(pwd)
echo $CURRENT

////
/home
  • ${} 变量替换(使用变量)

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界

name=yangzhen # 可以不用引号
test=hello,${name}  # {}加不加都一样
echo $test

////
hello,yangzhen

read

Linux read命令用于从标准输入读取数值。

-p 后面跟提示信息,即在输入前打印提示信息。

-s 安静模式,在输入字符时不再屏幕上显示,例如login时输入密码。

-t 后面跟秒数,定义输入字符的等待时间

if read -t 5 -p "input website:" website
then
  echo "your input is $website"
else
  echo "timeOut"
fi
  exit 0

-n 参数设置 read 命令计数输入的字符。当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量

case ... esac

该例子使用了-n 选项,后接数值 1,指示 read 命令只要接受到一个字符就退出。只要按下一个字符进行回答,read 命令立即接受输入并将其传给变量,无需按回车键。

case ... esac 为多选择语句,与其他语言中的 switch ... case 语句类似,是一种多分支选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case ... esac 语句,esac(就是 case 反过来)作为结束标记。

read -n1 -p "Do you want to continue[Y/N]?" answer
case $answer in
Y | y)
  echo "continue";;
N | n)
  echo "bye";;
* )
  echo "error";;
esac
exit 0

函数

function stop_docker()
{
    echo "Try to stop container: $DOCKER_NAME..."
    docker ps | grep -E "(${DOCKER_NAME})" | awk '{print $1}' | uniq | xargs -I {} docker stop {}
}

grep

grep 命令用于查找文件里符合条件的字符串

  • -e 指定字符串做为查找文件内容的样式
  • -E 将样式为延伸的正则表达式来使用
 grep -E "(${DOCKER_NAME})"
 
 grep -e "${DOCKER_NAME}"

awk

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具

awk '{print $1}'

每行按空格或TAB分割,输出文本中的第1项

uniq

uniq 可检查文本文件中重复出现的行列并删除

xargs

给命令传递参数的一个过滤器

xargs 的一个选项 -I,使用 -I 指定一个替换字符串 {}

执行过程

docker ps

CONTAINER ID   IMAGE                                                         COMMAND                  CREATED       STATUS       PORTS     NAMES
fc9690592571   xx.xx.xx.xx:31104/iiot/iiot-gateway:v2.16.0-nodel   "/bin/sh ./start-gat…"   2 days ago    Up 2 hours             iiot-gateway-2.16.0
313f21aa1315   xx.xx.xx.xx:31104/iiot/iiot-gateway:v2.15.0         "/bin/sh ./start-gat…"   4 weeks ago   Up 2 hours             iiot-gateway

docker ps | grep -E "(iiot-gateway-2.16.0)"

fc9690592571   xx.xx.xx.xx:31104/iiot/iiot-gateway:v2.16.0-nodel   "/bin/sh ./start-gat…"   2 days ago    Up 2 hours             iiot-gateway-2.16.0

docker ps | grep -E "({DOCKER_NAME})" | awk '{print 1}'

fc9690592571

docker ps | grep -E "({DOCKER_NAME})" | awk '{print 1}' | uniq

fc9690592571

docker ps | grep -E "({DOCKER_NAME})" | awk '{print 1}' | uniq | xargs -I {} docker stop {}

完成docker容器停止

完整网关脚本

#!/bin/bash
DOCKER_FILE=iiot-gateway.docker
DOCKER_NAME=iiot-gateway-2.16.0
CONFIG_PATH=$(pwd)
IMAGE_NAME=xx.xx.xx.xx:31104/iiot-gateway
IMAGE_VERSION=v2.16.0-nodel
VOLUME_PATH=$(pwd)/volumedata/gateway
HOST_NAME=$(hostname)
HARBOR_IMAGE_NAME=y2-harbor.xx.com:31104/iiot/iiot-gateway
HARBOR_IMAGE_VERSION=v2.16.0.0-nodel


#load docker image from harbor
function load_image_from_harbor()
{
    echo "Try to pull docker image: $HARBOR_IMAGE_NAME:$HARBOR_IMAGE_VERSION ..."
    docker pull ${HARBOR_IMAGE_NAME}:${HARBOR_IMAGE_VERSION}

    echo "Re tag harbor image to: $IMAGE_NAME:$IMAGE_VERSION ..."
    docker tag ${HARBOR_IMAGE_NAME}:${HARBOR_IMAGE_VERSION} ${IMAGE_NAME}:${IMAGE_VERSION}

    echo "Del harbor image $HARBOR_IMAGE_NAME:$HARBOR_IMAGE_VERSION ..."
    docker rmi ${HARBOR_IMAGE_NAME}:${HARBOR_IMAGE_VERSION}

    echo "Save docker image file $CONFIG_PATH/files/gateway/$DOCKER_FILE..."
    docker save -o ${CONFIG_PATH}/files/gateway/${DOCKER_FILE} ${IMAGE_NAME}:${IMAGE_VERSION}
}

#del container
function destory_docker()
{
    stop_docker

    echo "try to del container: $DOCKER_NAME..."
    docker ps -a | grep -E "(${DOCKER_NAME})" | awk '{print $1}' | uniq | xargs -I {} docker rm --force {}
}

#stop container
function stop_docker()
{
    echo "Try to stop container: $DOCKER_NAME..."
    docker ps | grep -E "(${DOCKER_NAME})" | awk '{print $1}' | uniq | xargs -I {} docker stop {}
}


#restart container
function restart_docker()
{
    echo "Try to restart container: $DOCKER_NAME..."
    docker ps | grep -E "(${DOCKER_NAME})" | awk '{print $1}' | uniq | xargs -I {} docker restart {}
}

#del image
function destory_image()
{
    # Stop Container
    destory_docker

    # Del image
    echo "Try to del image: $IMAGE_NAME:$IMAGE_VERSION..."
    docker images | grep -E "(${IMAGE_NAME}|${IMAGE_VERSION})" | awk '{print $3}' | uniq | xargs -I {} docker rmi {}
}

function load_image()
{
	echo "loading image: $IMAGE_NAME:$IMAGE_VERSION..."
	docker load -i ${CONFIG_PATH}/files/gateway/${DOCKER_FILE}
}

function build_container()
{
  echo "$VOLUME_PATH root path is ${VOLUME_PATH}"
  if [ ! -d ${VOLUME_PATH}/logs  ];then
    mkdir -p ${VOLUME_PATH}/logs

    chmod -R 755 ${VOLUME_PATH}
    chmod -R 777 ${VOLUME_PATH}/logs
  fi

  run_container
}

function run_container()
{
   echo "docker run -d --net=host --restart=on-failure:10 --add-host=${HOST_NAME}:127.0.0.1 --mount type=bind,src=${CONFIG_PATH}/configs/gateway/config,dst=/thingsboard_gateway/config --mount type=bind,src=${CONFIG_PATH}/configs/gateway/data,dst=/thingsboard_gateway/data -v ${VOLUME_PATH}/logs:/logs --name ${DOCKER_NAME} ${IMAGE_NAME}:${IMAGE_VERSION}"
   docker run -d --net=host --restart=on-failure:10 -p 5000:5000 --add-host=${HOST_NAME}:127.0.0.1 --mount type=bind,src=${CONFIG_PATH}/configs/gateway/config,dst=/thingsboard_gateway/config --mount type=bind,src=${CONFIG_PATH}/configs/gateway/data,dst=/thingsboard_gateway/data -v ${VOLUME_PATH}/logs:/logs --name ${DOCKER_NAME} ${IMAGE_NAME}:${IMAGE_VERSION}
}

echo -e ""
echo "Choose the command:"
echo "===================================================================================="
echo " [0]  exit."
echo " [1]  build: build & run the container & del the old container."
echo " [2]  restart: restart the container."
echo " [3]  build all: load image & run the container & del the old container and image."
echo " [4]  del container: only destory the container."
echo " [5]  del image: destory the image & the container."
echo " [6]  load image: only load the image."
echo " [7]  load image: load image from harbor"
echo "===================================================================================="
echo -e ""

while true
do
  read -p "Please input your command number: " num

	if [ ! -n "$num" ] ;then
	  echo "Please input the right number."
	  continue
	elif [ $num -eq 0 ];then
	  exit
	elif [ $num -eq 1 ];then
	  destory_docker
	  build_container
	  break
	elif [ $num -eq 2 ];then
    restart_docker
	  break
	elif [ $num -eq 3 ];then
	  destory_image
	  load_image
	  build_container
	  break
	elif [ $num -eq 4 ];then
	  destory_docker
	  break
	elif [ $num -eq 5 ];then
	  destory_image
	  break
	elif [ $num -eq 6 ];then
	  load_image
	  break
	elif [ $num -eq 7 ]; then
	  load_image_from_harbor
	  break
	fi
done