docker安装并跑通QQ机器人实践(2)-签名服务器bs-qsign搭建

在前文中,我们详尽阐述了QQ机器人的搭建过程及其最终实现的各项功能展示。接下来,我们将转向探讨该项目基于Docker构建服务的具体实践。本篇将以QQ机器人签名服务——qsign为起点,逐步展开论述。

1 获取和运行 xzhouqd/qsign:8.9.63 镜像

1.1 获取镜像

获取镜像有两种方式

1.1.1 从 Docker Hub 拉取镜像
docker pull xzhouqd/qsign:8.9.63
1.1.2 从本地存储文件加载镜像
docker load -i xzhouqd_qsign_8.9.63.tar

上面提及的示例文件 “xzhouqd_qsign_8.9.63.tar” ,实际上是由 Docker 镜像导出并存储到本地的压缩文件。那么,这样的文件是如何生成的呢?接下来,我们将逐步揭示这一过程。
首先,我们需要使用 Docker 的镜像列举命令来确认目标镜像是否已经存在于本地的 Docker 环境中:

docker images

执行的结果如下图:
在这里插入图片描述
通过执行上述命令,您将看到一个列表,其中包含了本地已有的所有镜像或指定镜像的信息。如果目标镜像确实存在,它将在列表中显示;否则,需要从远程仓库(如Docker Hub)拉取或通过其他方式获取(如:1.1.1所述 )。

假设“xzhouqd/qsign:8.9.63”镜像已存在于本地Docker环境中,接下来我们将演示如何将其导出为.tar文件:

docker save -o xzhouqd_qsign_8.9.63.tar xzhouqd/qsign:8.9.63

这条命令中:

  • docker save 是用于导出镜像的Docker命令。
  • -o xzhouqd_qsign_8.9.63.tar 指定了导出后压缩文件的名称和路径。
  • xzhouqd/qsign:8.9.63 是要导出的镜像的完整名称(包括仓库名、镜像名和标签)。

执行此命令后,Docker将把指定镜像及其依赖的所有层打包成一个名为“xzhouqd_qsign_8.9.63.tar”的.tar文件,并将其保存到当前工作目录下。至此,我们就成功创建了由Docker镜像生成的本地压缩文件。

1.2 由镜像运行生成容器

docker run -d `# -d 表示保持后台运行` \--restart=always `# 表示开机即自动运行` \--name bs-qsign `容器名称` \-p 18080:8080 `# 端口映射,将容器的 8080 端口映射到宿主机的 18080 端口` \-e ANDROID_ID=xxxxxxx `# 此值可以随便设置,但需要和 cqhttp 里的设置一致` \xzhouqd/qsign:8.9.63 # 镜像文件

小贴士: 在多行Shell命令文件中,欲在行尾使用反斜杠 \ 进行续行的同时添加注释,可于 \ 之前插入一对反引号 ` 包裹的 # 字符来实现,以此实现续行与注释的结合。

至此,bs-qsign 签名服务器已顺利完成搭建。为便于后续进行参数的动态调整、实现与其他容器间配置的统一管理,以及一键启动具有复杂功能的扩展服务,建议将相关参数迁移至配置文件进行妥善存储。

2 创建配置文件:config.sh

此配置文件,由以下几个部分构成

2.1 基本参数

appName="bs-qsign" # 应用名称
appVersion="0.0.1" # 应用版本号
imageName="xzhouqd/qsign:8.9.63" # 镜像名称
containerName="$appName" # 容器名称

2.2 docker run 相关配置

通常情况下,我们在配置Docker容器时会涉及以下三个核心要素:

  • Volumes —— 用于宿主机与容器之间实现文件或目录的双向同步映射,确保数据持久化及共享。在配置文件里以变量 volumes 表示。

  • Ports —— 通过端口映射,使得外部能够访问到容器内部运行的服务,实现网络通信。在配置文件里以变量 ports 表示。

  • Environments —— 设置环境变量,为容器内应用程序提供必要的运行时配置信息。在配置文件里以变量 envs 表示。

对于上述各项配置,可根据实际应用场景自由选择适用的项目。对于暂时无需使用的配置项,可以选择对其进行注释以备后续参考,或者直接删除以保持配置文件简洁。

# docker run 相关配置(可选项,如为空,可不填)volumes=(/path_in_host:/path_in_container) 
# /path_in_host - 宿主机目录
# /path_in_container - 容器目录ports=("18080:8080") # 宿主机端口:容器端口envs=("ANDROID_ID=tanbushi01") # 变量名=变量值

上述以圆括号 () 包围的数据结构在Shell脚本中定义了一个数组。其中,用单引号或双引号包裹的文本构成数组的各个元素,多个元素之间以空格分隔。以包含多个端口映射的数组为例:

ports=("18080:8080" "15703:5703")

这里,数组 ports 包含两个元素:“18080:8080” 和 “15703:5703”,分别代表将宿主机的18080端口映射到容器的8080端口,以及将宿主机的15703端口映射到容器的5703端口。

类似地,对于 volumes(卷映射)和 envs(环境变量)数组的定义,只需按照相同的方式指定各自的映射关系或环境变量键值对即可:

volumes=("host_path1:container_path1" "host_path2:container_path2")
envs=("VAR1=value1" "VAR2=value2")

以上述方式声明的 volumes 数组表示将宿主机的 host_path1 目录映射到容器的 container_path1,host_path2 目录映射到 container_path2。而 envs 数组则设置了两个环境变量:VAR1 的值为 value1,VAR2 的值为 value2。

2.3 标记 config.sh 脚本执行状态

通过设置变量 configured 来标记 config.sh 脚本是否已执行过:

configured=true

当该变量值为 true 时,表明 config.sh 脚本已成功执行过一次,旨在防止后续重复加载或执行配置,确保系统的稳定性和一致性。

最终的config.sh内容如下:

#!/bin/bash# 基本参数
appName="bs-qsign" # 应用名称
appVersion="0.0.1" # 应用版本号
imageName="xzhouqd/qsign:8.9.63" # 镜像名称
containerName="$appName" # 容器名称# docker run 相关配置(可选项,如为空,可不填)
ports=("18080:8080")
envs=("ANDROID_ID=tanbushi01")# 标记是否已经配置过
configured=true # 标记变量——此脚本已经被执行过

3 运行容器的脚本:run.sh

#!/bin/bash# 运行初始化脚本
. ../../shell-scripts/run_init.sh# 创建并执行临时文件——实现 docker run 命令(临时文件不是在容器里哦!)
. ../../shell-scripts/run_in_tmp.shecho ""
echo "*********************************************************"
echo "成功创建容器:【 $containerName 】!"
echo "*********************************************************"
echo ""

3.1 初始化脚本:run_init.sh

#!/bin/bashset -e # 遇到错误时退出脚本# 判断是否运行过配置文件 config.sh,如果未运行过,则运行配置文件
if [ -z "$configured" ]; then. ./config.sh
fi# 检查 Docker 是否在运行
if ! docker info > /dev/null 2>&1; thenecho "Docker 没有运行。请启动 Docker 再试!"exit 1
fi# 查看指定名称和TAG的镜像是否存在
str=$imageName
IFS=":"
read -ra parts <<< "$str"
_img_name=${parts[0]}
_img_tag=${parts[1]}
set +e
rslt=`docker images | grep -E "^$_img_name\s+$_img_tag\s+"`
set -e
# 判断字符串是否为空
if [ -z "$rslt" ]; thenecho "镜像不存在,请先构建镜像!"exit 2
fi# 检查容器是否存在
if docker ps -a --filter "name=$containerName" | grep -q "$containerName"; thenecho ""echo "容器【 $containerName 】存在,先停止,再删除..."# 容器存在,先停止,再删除echo ""echo "停止容器【 $containerName 】..."docker stop $containerName > /dev/null 2>&1echo ""echo "删除容器【 $containerName 】..."echo ""docker rm $containerName > /dev/null 2>&1
fi

3.2 临时生成的运行 docker run 的脚本:run_in_tmp.sh

#!/bin/bashOS=$(uname)is_windows=falsecase "$OS" inLinux) # 在 Linux 系统上运行 ;;Darwin) # 在 macOS 系统上运行;;CYGWIN*|MINGW32*|MSYS*|MINGW*) # 在 Windows 系统上运行is_windows=true;;*)echo "Unknown OS: $OS" # 在其他系统上运行;;
esac# 执行 docker run 命令的临时脚本文件名
shell_script="/tmp/${containerName}_run.sh"# 输出数组元素生成映射 volume、port、env
function exportMapItems() {local script_name=$1 # 脚本文件名shiftlocal type_prefix=$1 # 类型前缀shift # 如果是windows,同时$type_prefix是-v 则自动添加斜杠if [ "$is_windows" = true ] && [ "$type_prefix" = "-v" ]; thenauto_slash=/elseauto_slash=""fi# echo "auto_slash=$auto_slash"local -a items=("$@")for map_item in "${items[@]}"; do# 输出数组元素echo "  ${type_prefix} ${auto_slash}${map_item} \\" >> $script_name# echo "  ${type_prefix} ${auto_slash}${map_item} \\"done
}# 创建临时文件:/tmp/_run.sh(不是在容器里哦!)
echo "#!/bin/bash" > $shell_script
echo "" >> $shell_script
echo "docker run -itd \\" >> $shell_script
echo "  --restart always \\" >> $shell_script# 写入 volumes,注意,此处只能是-v,不是-V
exportMapItems $shell_script "-v" "${volumes[@]}"# 写入 ports,注意,此处只能是-p,不是-P
exportMapItems $shell_script "-p" "${ports[@]}"# 写入 envs,注意,此处只能是-e,不是-E
exportMapItems $shell_script "-e" "${envs[@]}"# 写入 name
echo "  --name $containerName \\" >> $shell_script# 写入 imageName
echo "  $imageName" >> $shell_scriptchmod 755 $shell_script
. $shell_script
rm -f $shell_script

4 总结

本篇首先讲述了Docker 镜像拉取、保持到本地、从本地加载等操作流程;其次通过两个文件构建了一种可配置的机制,使得基于指定镜像创建并运行容器的过程更具通用性和灵活性。不仅适用于当前的 bs-qsign 服务部署场景,还能无缝应用于后续提及的其他服务搭建,从而增强了部署流程的标准化程度、适应性和代码复用性。


上一篇:docker安装并跑通跑通QQ机器人实践(1)-前言及展示

下一篇:敬请期待…


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/822271.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

社交媒体数据恢复:YY语音

YY语音数据恢复指南 在我们的日常生活中&#xff0c;数据丢失是一种常见的现象。有时候&#xff0c;我们可能会不小心删除了重要的文件&#xff0c;或者因为硬件故障而导致数据丢失。在这种情况下&#xff0c;数据恢复软件可以帮助我们找回丢失的数据。本文将重点介绍如何使用Y…

Day91:API攻防-接口安全SOAPOpenAPIRESTful分类特征导入项目联动检测

目录 API分类特征-SOAP&OpenAPI&RESTful API分类特征 API常见漏洞 API检测流程 API检测项目-Postman&APIKit&XRAY 工具自动化-SOAP - WSDL Postman 联动burpxray APIKit插件(可联动xray) 工具自动化-OpenApi - Swagger Postman 联动burpxray APIKit…

【可实战】测试体系与测试方案设计(业务按公司实际情况,技术可参考通用测试方案)

一、如果我们要测试一个系统&#xff0c;首先我们要了解被测系统的架构 &#xff08;一&#xff09;业务架构-从需求里面去了解&#xff08;角色和行为&#xff09;&#xff1a; 业务模型分析&#xff08;是一个电商&#xff0c;还是一个企业的crm&#xff0c;还是一个网站&a…

科技驱动未来,提升AI算力,GPU扩展正当时

要说这两年最火的科技是什么&#xff1f;我想“AI人工智能”肯定是最有资格上榜的&#xff0c;尤其ChatGPT推出后迅速在社交媒体上走红&#xff0c;短短5天&#xff0c;注册用户数就超过100万&#xff0c;2023年一月末&#xff0c;ChatGPT的月活用户更是突破1亿&#xff0c;成为…

Visual Components:3D工厂仿真软件 | 离散物流、机器人编程与PLC调试

在数字化浪潮席卷全球制造业的今天&#xff0c;一款强大的3D工厂仿真软件已经成为企业提升生产效率、优化流程设计的关键工具。而Visual Components&#xff0c;正是这场变革中的领军者。本文将带您深入探索这款软件的核心功能与优势&#xff0c;揭示其如何在离散物流、机器人编…

介绍与部署 Zabbix 监控系统

目录 前言 一、监控系统 1、主流的监控系统 2、监控系统功能 二、Zabbix 监控系统概述 1、Zabbix 概念 2、Zabbix 主要特点 3、Zabbix 主要功能 4、Zabbix 监控对象 5、Zabbix 主要程序 6、Zabbix 监控模式 7、Zabbix 运行机制 8、Zabbix 监控原理 9、Zabbix 主…

Git回滚操作,工作区和暂存区恢复修改删除的文件

在利用git协作过程中&#xff0c;经常需要进行代码的撤销操作&#xff0c;这个行为可能发生在工作区&#xff0c;暂存区或者仓库区&#xff08;或版本库&#xff09;。 我们先讨论在工作区与暂存区发生的撤销行为&#xff0c;这里会有两个命令提供帮助&#xff0c;git restore…

Day 15 Linux网络管理

IP解析 IP地址组成&#xff1a;IP地址由4部分数字组成&#xff0c;每部分数字对应于8位二进制数字&#xff0c;各部分之间用小数点分开&#xff0c;这是点分2进制。如果换算为10进制我们称为点分10进制。 每个ip地址由两部分组成网络地址(NetID)和主机地址(HostID).网络地址表…

养猫必看!毛发护理秘籍,猫粮选择大揭秘!

亲爱的猫友们&#xff0c;我们都知道&#xff0c;猫咪的毛发是它们健康与美丽的象征。选择一款合适的猫粮&#xff0c;对于猫咪的毛发健康至关重要。那么&#xff0c;如何根据猫咪的毛发情况来选择合适的猫粮呢&#xff1f;接下来&#xff0c;就让我来为你详细解答吧&#xff0…

PDF文档电子签名怎么做?

如何确保电子文档的签署具有公信力和法律效力&#xff0c;防止伪造和假冒签名等问题&#xff0c;是电子文档无纸化应用面临的重要挑战。本文将详细介绍PDF文档电子签名的概念、重要性、实施步骤以及相关的法律背景&#xff0c;帮助用户理解并有效应用PDF文档电子签名技术。 1.…

lv_micropython for ESP32-S2/S3/C3

一、更新文件 lv_binding_micropython:GitHub - kdschlosser/lv_binding_micropython at esp32-s-c-h_support 下载lv_binding_micropython分支&#xff1a; git clone -b esp32-s-c-h_support https://github.com/kdschlosser/lv_binding_micropython.git 替换文件&#x…

安装指定版本的ant-design-vue和指定版本的@ant-design/icons-vue 图标组件包

前言&#xff1a; 最近在完成公司的项目时&#xff0c;为了兼容其他的版本&#xff0c;需要安装指定版本的ant-design-vue和ant-design/icons-vue 图标组件包&#xff0c;安装成功之后&#xff0c;分享如下&#xff1a; 安装命令&#xff1a; ant-design-vue&#xff1a; 不…

【MATLAB源码-第54期】基于白鲸优化算法(WOA)和遗传算法(GA)的栅格地图路径规划最短路径和适应度曲线对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1.白鲸优化算法&#xff08;WOA&#xff09;&#xff1a; 白鲸优化算法是一种受白鲸捕食行为启发的优化算法。该算法模拟了白鲸群体捕食的策略和行为&#xff0c;用以寻找问题的最优解。其基本思想主要包括以下几点&#xff…

Docker 学习笔记(九):Docker 网络原理,理解 docker0,虚拟网卡,容器互联,以及跨网络连通

一、前言 记录时间 [2024-4-16] 系列文章简摘&#xff1a; Docker 学习笔记&#xff08;六&#xff09;&#xff1a;挑战容器数据卷技术一文通&#xff0c;实战多个 MySQL 数据同步&#xff0c;能懂会用&#xff0c;初学必备 Docker 学习笔记&#xff08;七&#xff09;&#x…

回归损失函数

目录 1 MAE 2 MSE 3 MAPE 4 Quantile Loss分位数损失 回归损失函数也可以做为评价指标使用&#xff0c;但是有没有想过数据分布与损失函数之间的关系呢&#xff01; 使用特定损失函数的前提是我们对标签的分布进行了某种假设&#xff0c;在这种假设的前提下通过极大似然法推…

基于微信小程序投票评选系统的设计与实现(论文+源码)_kaic

摘 要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱。所以各大互联网厂商都瞄准移动互联网这个潮…

攻防世界10-disabled_button

10-disabled_button 法1&#xff1a;修改html的标签内容 首先看题目描述提到前端知识&#xff0c;联想到HTML&#xff0c;提示是一个不能按的按钮&#xff0c;结合题目名button很明显是涉及到HTML button标签知识&#xff0c;最后通过disabled提示应该是按钮被禁用了 知识补充…

1990–2016年中国30米分辨率水稻种植分布数据集

本数据集为1990–2016年中国30米分辨率水稻种植分布数据集&#xff0c;覆盖范围包含中国大陆25个省级行政区。数据文件格式为GeoTIFF&#xff0c;地理参考为WGS84&#xff08;EPSG:4326&#xff09;&#xff0c;每年一个文件&#xff0c;文件名格式为 CCD-Rice-China-年份-v1.t…

嵌入式第四天:(C语言入门)

目录 什么是数组&#xff1f; 数组&#xff1a; 数组的使用&#xff1a; 数组的初始化&#xff1a; 数组名&#xff1a; 数组案例&#xff1a; 一维数组的最大值&#xff1a; 一维数组的逆置&#xff1a; 数组和指针&#xff1a; 通过指针操作数组元素&#xff1a; …

二刷大数据(二)- Spark

目录 SparkHadoop区别核心组件运行架构Master&WorkerApplication (Driver)Executor RDD概念yarn下工作原理算子依赖血缘关系阶段划分广播变量 shuffle流程SparkSQLDataSet、DataFrame、RDD相互转换 SparkStreaming Spark Spark是一种基于内存的快速、通用、可扩展的大数据…