情景再现

最近有一个部署服务,是具有绝对外网隔离的环境,不能构建自动化的发布服务,项目大体完工,但是改动的细节还是很多很小,存在一个频繁的发版情况。为了方便的发版,我只能基于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

效果如下

脚本怎么进入容器执行命令 shell脚本进入容器_hg

  • 报错:read without -r will mangle backslashes.
  • 解决:shell脚本缺少权限, chmod +x 脚本名称 进行权限赋值
  • 报错:read without -r will mangle backslashes.
  • 解决:Read将解释空格和换行符之前的反斜杠,通常您只想读取数据,这就是read -r所做的
  • 报错:$Permission denied
  • 解决:shell脚本缺少权限, chmod +x 脚本名称 进行权限赋值

博客review计划

由于以前很多时候是为了记录一下笔记,有的是为了活动啊之类的,导致很多博客环境不全,代码不全,排版混乱,专栏分类不清楚,所以在开始写新的博客直接,开启review计划。
review:20220820