目录
前言
最近在使用Jenkins + Docker做自动化构建的时候,发现有些需要在服务器上执行一些必不可少的Linux命令,而这些命令都是些重复的手工操作。故而想着通过脚本.sh文件来替代这些manual操作。
在之前的工作中很少写sh脚本,所以将整理的在这里记录下来,一是好记性不如烂笔头,以防自己过几天就忘了,二也是希望可以帮到和我有同样需求的人。
Shell基本知识
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
第一个简单的shell脚本:
#!/bin/bash echo "Hello World !"
- #!/bin/bash:/bin/bash是一定存在的。所以/bin/bash是显示指定的优先选择。
- #!/usr/bin/env bash:用户不需要去寻找程序在系统中的位置(因为在不同的系统,命令或程序存放的位置可能不同),只要程序在你的$PATH中
大部分情况下,/usr/bin/env是优先选择的,因为它提供了灵活性,特别是你想在不同的版本下运行这个脚本;
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
第一个Docker执行脚本
这里提供一个运行springboot-test镜像的脚本:
#!/usr/bin/env bash app_name='springboot-test' app_port='8080' # 停止正在运行的容器 echo '......stop container......' docker stop ${app_name} # 删除容器 echo '......rm container......' docker rm ${app_name} # 删除none镜像 echo '......rm none images......' docker rmi `docker images | grep none | awk '{print $3}'` # 重新生成并运行容器 echo '......start container......' docker run -p ${app_port}:${app_port} --name ${app_name} \ --link redis:redis \ -e TZ="Asia/Shanghai" \ -v /etc/localtime:/etc/localtime \ -v /home/myapp/${app_name}/logs:/var/logs \ -d test/${app_name}
命令解释:
- app_name='springboot-test':定义项目变量名;
- docker stop ${app_name}:根据容器名称:“NAMES”,停止正在运行的容器;
- docker rmi `docker images | grep none | awk '{print $3}'`:删除镜像名字是“none”的镜像,这里使用none,是因为使用Jenkins构建的时候,重新生成了镜像名字相同的镜像,导致以前版本的镜像被替换成none;
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具
echo '11 22 33 44' | awk '{print $3" "$2" "$1}' 输出:33 22 11
这里的docker images | grep none | awk '{print $3}',将输出REPOSITORY是none的镜像IMAGE ID
反引号``是命令替换,命令替换是指Shell可以先执行``中的命令,将输出结果暂时保存,在适当的地方输出。语法:`command`;
末尾“\”:换行输入多条命令
- --link redis:redis:连接容器redis,进行通信;
- -e TZ="Asia/Shanghai":设置环境变量TZ="Asia/Shanghai",这里设置时区;
- -v /etc/localtime:/etc/localtime:run容器时添加参数挂载宿主时间配置
- -v /home/myapp/${app_name}/logs:/var/logs:将宿主机目录/home/myapp/${app_name}/logs,挂载到容器/var/logs下
此命令可以将容器的日志备份到宿主机上,且删除容器的时候日志不会跟着被删除,避免日志丢失。
- -d :后台运行
- -p hostPort:containerPort
- --name:指定容器名称
- 最后的test/${app_name}:使用的镜像名称;
本文参考: