shell自动拉取镜像并运行
小黄瓜要编程 人气:0情景再现
最近有一个部署服务,是具有绝对外网隔离的环境,不能构建自动化的发布服务,项目大体完工,但是改动的细节还是很多很小,存在一个频繁的发版情况。为了方便的发版,我只能基于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 脚本名称 进行权限赋值
加载全部内容