实现脚本自动部署docker

实现,脚本,自动,部署,docker · 浏览次数 : 0

小编点评

## 脚本内容: ```bash #!/bin/bash # 进入指定文件夹打包成imagecd docker ps | grep "mobile" | awk '{print $1}' | xargs docker stop docker rm m1 docker rm m2 docker rm m3 # 构建 Docker 镜像并获取其 ID IMAGE_ID=$(docker build -t xxx:Tag . -q) # 使用镜像 ID 运行 Docker 容器 docker run -d -p 0001:8080 --name mobile2 -v /opt/xx/:/opt/xx/ & docker run -d -p 0002:8080 --name mobile1 -v /opt/xx/:/opt/xx/ & docker run -d -p 0003:8080 --name mobile3 -v /opt/xx/:/opt/xx/ & # 退出所有容器 docker ps -a ``` ## 解决方案: 1. **权限问题:** 脚本需要具有写入 `/usr/local/bin/` 目录的权限才能执行。尝试使用 `sudo` 权限来更改权限。 2. **换行符问题:** 脚本中使用了 Windows 风格的换行符 `\\r`,而 Linux 使用的是 `\n`。由于脚本可能包含 Windows风格的换行符,导致解释器无法找到正确的路径。可以使用 `sed` 或 `dos2unix` 等工具进行换行符转换。 3. **退出容器问题:** 使用 `docker ps -a` 命令显示所有容器,并使用 `docker kill` 命令停止所有容器。 ## 总结: 该脚本通过自动构建 Docker 镜像并运行多个容器来实现多副本部署。由于权限问题、换行符问题和退出容器问题,需要分别进行解决方案。建议在运行脚本之前确保脚本具有写入 `/usr/local/bin/` 目录的权限,并确保脚本中使用的换行符符合 Linux 风格。

正文

前言:

  使用场景是 我这边的一个单体项目需要多一个多副本的部署方式,一直输入重复命令我实在是嫌烦了,使用写了一个脚本来一键更新部署上去。jar包都是我手动上传的,没有把包传入公网库里。

 之所以记录就是因为遇到了几个没有遇到过的问题记录以下。

 示例:

#!/bin/bash
# 进入指定文件夹打包成image
cd /soft/xx/xx/
# 停止和删除包含 "mobile" 在名称中的容器
docker ps | grep "mobile" | awk '{print $1}' | xargs docker stop
docker rm m1
docker rm m2
docker rm m3
# 构建 Docker 镜像并获取其 ID
IMAGE_ID=$(docker build -t xxx:Tag . -q)
# 使用镜像 ID 运行 Docker 容器
docker run -d -p 0001:8080 --name mobile2 -v /opt/xx/:/opt/xx/ $IMAGE_ID
docker run -d -p 0002:8080 --name mobile1 -v /opt/xx/:/opt/xx/ $IMAGE_ID
docker run -d -p 0003:8080 --name mobile3 -v /opt/xx/:/opt/xx/ $IMAGE_ID
 
省略每次输入 chmod +x script 这个命令,可以将脚本复制到一个在系统 PATH 中的目录中,这样就可以在任何地方执行它,而无需添加 ./ 前缀或手动更改权限。
可以将脚本复制到 /usr/local/bin/ 目录中:
 
sudo cp 脚本文件名 /usr/local/bin/
 
然后就可以在任何地方都只需要输入 脚本名称就可以执行。

错误一:-bash: /usr/local/bin/runpoject: Permission denied 没有权限的命令

这个错误是由于权限问题引起的,它表示你没有足够的权限来执行 /usr/local/bin/runpoject 脚本。这是因为 /usr/local/bin 目录通常需要超级用户权限才能写入。

你可以尝试以下步骤来解决这个问题:

使用尝试使用以下命令:

 sudo chmod +x /usr/local/bin/script

错误二:-bash: /usr/local/bin/runpoject: /bin/bash^M: bad interpreter: No such file or directory 转义符的原因
这个错误消息表明你的脚本文件包含了 Windows 风格的换行符(\r\n),而不是 Linux 风格的换行符(\n)。这种问题可能会导致解释器无法找到正确的路径。

要解决这个问题,你可以使用文本编辑器将脚本文件转换为 Linux 风格的换行符。

你可以使用 dos2unix 命令来进行转换,如果系统没有安装这个命令,可以尝试使用 sed 命令来进行转换,如下所示:

sed -i 's/\r$//' /usr/local/bin/script

亲测可以解决问题。

与实现脚本自动部署docker相似的内容:

实现脚本自动部署docker

前言: 使用场景是 我这边的一个单体项目需要多一个多副本的部署方式,一直输入重复命令我实在是嫌烦了,使用写了一个脚本来一键更新部署上去。jar包都是我手动上传的,没有把包传入公网库里。 之所以记录就是因为遇到了几个没有遇到过的问题记录以下。 示例: #!/bin/bash # 进入指定文件夹打包成i

[转帖]通过Shell脚本自动监控JAVA进程中线程cpu使用率

https://gitee.com/jialy/auto-monitor-java-process/tree/master 本文主要介绍在 show-busy-java-threads.sh 脚本的功能基础上,通过 process-cpu-monitor.sh 脚本实现Linux平台上Java进程或

用 Python 脚本实现电脑唤醒后自动拍照 截屏并发邮件通知

背景 背景是这样的, 我的家里台式机常年 休眠, 并配置了 Wake On Lan (WOL) 方便远程唤醒并使用. 但是我发现, 偶尔台式机会被其他情况唤醒, 这时候我并不知道, 结果白白运行了好几天, 浪费了很多电. 所以我的需求是这样的: 🤔 电脑唤醒后(可能是开机, 有可能是从休眠状态唤醒

造个Python轮子,实现根据Excel生成Model和数据导入脚本

前言 最近遇到一个需求,有几十个Excel,每个的字段都不一样,然后都差不多是第一行是表头,后面几千上万的数据,需要把这些Excel中的数据全都加入某个已经上线的Django项目 这就需要每个Excel建个表,然后一个个导入了 这样的效率太低,不能忍 所以我造了个自动生成 Model 和导入脚本的轮

[转帖]详解自动交互命令expect,免去手动输入!

https://zhuanlan.zhihu.com/p/192470248 #概述expect是一个用来实现自动交互功能的软件套件,是基于TCL的脚本编程工具语言,方便学习,功能强大 #扩展TCL:全拼为Tool Command Language ,是一种脚本语言,由John Ousterout创

[转帖]shell脚本使用expect自动化交互登录远程主机进行批量关机

前文 1.目标主机登录用户都为root,且密码一致 2.目标主机开放启动了SSH服务且22号端口可访问(防火墙未进行拦截) 软件介绍 expect Expect是一个用来实现自动和交互式任务进行通信的免费编程工具语言。由Don Libes在1990年开始编写。 结合Shell Script实现自动和

[转帖]echo 输出不换行-e \c

http://www.my889.com/i/1952 在shell中,echo输出会自动换行。有时候在循环中不希望echo输出换行。代码实现如下: 1 echo -e " \c" # -e 表示开启转义, \c表示不换行 脚本: 1 2 3 4 5 6 7 8 9 #!/bin/bash i=1

Python网络爬虫原理及实践

网络爬虫:是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。网络爬虫相关技术和框架繁多,针对场景的不同可以选择不同的网络爬虫技术。

iOS使用Run Script提升开发效率

通过在Xcode Run Script添加shell脚本,然后通过脚本来帮助我们在编译阶段完成一下资源的copy,文件替换,修改等繁琐的事件。使Xcode在编译过程中自动完成耗时繁琐的操作提升开发效率。 添加脚本的过程很简单,添加+添加 添加完脚本后可以根据需要调整脚本的执行顺序,如:对应Bundl

[转帖]Bash 脚本实现每次登录到 Shell 时可以查看 Linux 系统信息

Linux 中有很多可以查看系统信息如处理器信息、生产商名字、序列号等的命令。你可能需要执行多个命令来收集这些信息。同时,记住所有的命令和他们的选项也是有难度。-- Magesh Maruthamuthu(作者) Linux 中有很多可以查看系统信息如处理器信息、生产商名字、序列号等的命令。你可能需