使用Shell脚本部署
window系统有bat文件可以执行脚本,linux下可以使用shell执行脚本
shell语句
先来简单记录一下 shell 语句的含义:
- $# 代表参数的个数;
- -lt (less than) 小于 -gt ( greater than ) 大于 -eq ( equal ) 相等 -ne (not equal ) 不等 -ge (greater than or equal) 大于或等于 -le (less than or equal ) 小于或等于 ;
- echo 字符串输出,引号可以省略;
- $0 所写shell脚本本身名字,$1 脚本传入第一个参数, 2 脚本传入第二个参数, 2 脚本传入第二个参数, 2脚本传入第二个参数,$ 脚本运行的当前进程ID号,$! 后台运行的最后一个进程ID号;
- set -e 可以避免操作失败还继续往下执行的问题,在"set -e"之后出现的代码,一旦出现了返回值非零,整个脚本就会立即退出,set +e 当这句之后遇到非零的返回值,会继续执行,set -e 当这句之后遇到非零返回值,会直接退出;
- exit 0—是正常退出的命令,exit 1—是非正常退出的命令,echo $? 获取上次命令执行的结果,如果是0就是正常执行,如果非0就是执行出现了异常;
- {} 大括号,用户执行命令,{}中最后一个命令要用分号,第一个命令和左括号之前有一个空格,命令之间用;隔开;
- ()小括号,命令集合,括号中的命令会在子shell中执行,命令替换 $( cmd ) 等同于 cmd,将括号中的cmd执行,初始化数据 array = (a b c d)
- (()) 双小括号,进行整数运算的命令,不能对小数(浮点数)或者字符串进行运算
- function(){} - 代表一个函数
- if [-f /-z];then 执行内容 fi -f 如果存在且为普通文件为真; -z 如果字符串长度为零为真;-n 判断非空字符串为真
- $(cd
dirname $0
;pwd) 显示执行的脚本所在的目录,以绝对路径显示; pwd 显示当前敲的命令所在的目录,以绝对路径显示;
注意:
1、在shell中进行比较时,结果为0代表真,为1代表假。
2、-eq,-ne等比较符只能用于数字比较,有字符也会先转换成数字然后进行比较。
Docker 常用指令
docker info/version #docker环境信息
docker ps # 查看运行的容器信息
docker ps -a # 所有容器信息
docker search xx #查找镜像
docker pull xx #拉取镜像
docker rmi -f 镜像ID/name #删除本地镜像
docker logs -f 容器ID #跟踪实时日志
docker top 容器ID # 查看容器中进程信息
docker inspect 容器ID/name #获取容器/镜像的元数据 -f :指定返回值的模板文件-s :显示总的文件大小--type :为指定类型返回JSON
docker inspect --format '{{.LogPath}}' 容器ID #查看某容器的日志地址
docker build #构建镜像
docker run #启动镜像
docker system prune #清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)
docker system prune -a #命令清理得更加彻底,可以将没有容器使用Docker镜像都删掉
简单shell部署脚本实现
# 编译打包过程
set -e
cd /xx/xx # 进入项目目录
git checkout xxx #切换分支
git pull #拉取最新代码
cd /xx/xx/xx #进入项目具体模块
mvn clean install -Dmaven.test.skip=true #使用maven 打包
propid=`ps -aux|grep xx.jar |grep -v grep| awk ' {print $2}
#ps -ef/aux |grep java就是通过管道的方式,将ps命令查询出来的进程信息内容筛选出与jar进程相关的数据
#-v 参数,作用是反转查找,即过滤出除了grep的其他数据
# awk ' {print $2} awk对每行处理 print打印对应第二行的数据 也就是 xx.jar的pid
if[-n "${proid}"]; then
echo "存在进程: ${propid}"
kill -9 ${proid}
echo "杀死进程:${propid}"
eles
echo "进程不存在"
fi
#生成docker镜像
set -e
cd /xxx/xxx # 找到DockerFile所存在的目录
docker build -t x source/xx/
# -f :指定要使用的Dockerfile路径 -t name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签
# 后面部分为Dockerfile路径
set +e
#关闭名为x的容器
docker kill x
#删除停止的容器
docker rm x
set -e
docker run --name x -d -it --net="host" \
-v /home/xx.properties:/opt/xx/application-admin.properties \
-v /opt/files:/opt/files \
-v /opt/logs:/opt/logs \
-v /home:/home \
--security-opt label:disable \
x
# -v 给容器挂载存储卷,挂载到容器的某个目录
# -d 指定容器运行于前台还是后台,默认为 false
# -i 打开 STDIN,用于控制台交互
# -t 分配 tty 设备,该可以支持终端登录,默认为 false
# -name 指定容器名字,后续可以通过名字进行容器管理,links 特性需要使用名字
# –net=“hose” 容器使用主机网络
# --security-opt label:disable 关闭容器的标签限制