目录
- 情景再现
- 开发环境
- 开发过程
情景再现
最近有一个部署服务,是具有绝对外网隔离的环境,不能构建自动化的发布服务,项目大体完工,但是改动的细节还是很多很小,存在一个频繁的发版情况。为了方便的发版,我只能基于shell构建一个简单的自动化脚本
开发环境
脚本编辑工具:win10+vscode
脚本运行环境:centos7
开发过程
shell脚本基础
Shell是一个用 C 语言编写的程序。Shell 既是一种命令语言(脚本),又是一种程序设计语言。
简单理解就是和windos中cmd一样的一种命令语言,一种批处理的脚本类似的东西。
shell脚本的首行指定了shell脚本解释器的路径,而且这个指定路径只能放在文件的第一行
#!/bin/bash
查看自己linux系统的默认解析:echo $SHELL
[root@localhost ~]# echo $SHELL
/bin/bash
echo 输出文本,相当于print命令,console命令
echo -e “\033[32m 绿色文字 \033[0m”
会输出带有颜色的文字,可以将我们自己的输出和docker的输出加以区分
完成代码块,运行脚本,输入镜像版本,将自动拉取指定版本镜像并运行创建一个新的容器
#!/bin/bash
cml_version=""
cml_url="registry.cn-hangzhou.aliyuncs.com/xhgycf/xhg.cml.api:XHG.CML_2022${cml_version}_1"
sudo echo -e "\033[32m --start-- \033[0m"
sudo echo -e "\033[33m please input version: \033[0m"
read -r cml_version
cml_url="registry.cn-hangzhou.aliyuncs.com/xhgycf/xhg.cml.api:XHG.CML_2022${cml_version}_1"
sudo echo -e "\033[33m cml_version: $cml_url \033[0m"
sudo docker pull "$cml_url"
sudo echo -e "\033[32m 1.pull image from route \033[0m"
sudo docker stop c_llpcmlapi
sudo docker rm c_llpcmlapi
sudo echo -e "\033[32m 2.stop&rm c_llpcmlapi \033[0m"
sudo docker rmi i_llpcmlapi
sudo echo -e "\033[32m 3.rmi i_llpcmlapi \033[0m"
sudo docker tag "$cml_url" i_llpcmlapi
sudo echo -e "\033[32m 4.tag image \033[0m"
docker run -di -v /home/llp_docker/llpcmlapi/appsettings.json:/appsettings.json --name c_llpcmlapi -p 8089:80 i_llpcmlapi
sudo echo -e "\033[32m 5.run c_llpcmlapi \033[0m"
sudo docker ps
遇到的问题
报错:$‘\r’: command not found
解决: 由于shell脚本很简单,我直接在windos下用记事本写了一个.sh的文件,执行的时候重视报错各种错误,而且有时可能执行成功,有时会失败,猜测可能是编码的问题,于是用vscode打开,重新保存,还是不行,后来了解到原来windows下编译的shell文件,每一行的结尾是\n\r,而在linux下文件的结尾是\n,所以我们需要替换掉\r
cat -v 显示window下的回车字符
tr -d ‘\r’ < 原始文件 > 新文件:替换文件中的回车字符
[root@localhost llpcode]# cat -v cmlapi.sh
^M
sudo echo -e "\033[32m --start-- \033[0m"^M
sudo docker pull registry.cn-hangzhou.aliyuncs.com/xhgycf/xhg.cml.api:XHG.CML_20220603_1 ^M
sudo echo -e "\033[32m 1.pull image from route \033[0m"^M
sudo docker rmi i_llpcmlapi^M
sudo echo -e "\033[32m 2.rmi i_llpcmlapi \033[0m"^M
sudo docker tag registry.cn-hangzhou.aliyuncs.com/xhgycf/xhg.cml.api:XHG.CML_20220603_1 i_llpcmlapi ^M
sudo echo -e "\033[32m 3.tag image \033[0m"^M
sudo docker stop c_llpcmlapi ^M
sudo docker rm c_llpcmlapi ^M
sudo echo -e "\033[32m 4.stop&rm c_llpcmlapi \033[0m"^M
docker run -di -v /home/llp_docker/llpcmlapi/appsettings.json:/appsettings.json --name c_llpcmlapi -p 8089:80 i_llpcmlapi ^M
sudo echo -e "\033[32m 5.run c_llpcmlapi \033[0m"^M
sudo docker ps [root@localhost llpcode]# tr -d '\r' < cmlapi.sh > cmlapi_.sh
[root@localhost llpcode]# ls
blogcore cmlapi_.sh cmlapi.sh vue_xhg_cml
效果如下
报错:read without -r will mangle backslashes.
解决:shell脚本缺少权限, chmod +x 脚本名称 进行权限赋值
报错:read without -r will mangle backslashes.
解决:Read将解释空格和换行符之前的反斜杠,通常您只想读取数据,这就是read -r所做的
报错:$Permission denied
解决:shell脚本缺少权限, chmod +x 脚本名称 进行权限赋值
到此这篇关于shell自动拉取镜像并运行容器的shell脚本的文章就介绍到这了,更多相关shell自动拉取镜像并运行 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!