docker安装并跑通QQ呆板人实践(2)-署名服务器bs-qsign搭建 ...

打印 上一主题 下一主题

主题 513|帖子 513|积分 1539

在前文中,我们详尽论述了QQ呆板人的搭建过程及其终极实现的各项功能展示。接下来,我们将转向探讨该项目基于Docker构建服务的具体实践。本篇将以QQ呆板人署名服务——qsign为起点,渐渐睁开叙述。
  1 获取和运行 xzhouqd/qsign:8.9.63 镜像

1.1 获取镜像

获取镜像有两种方式
1.1.1 从 Docker Hub 拉取镜像

  1. docker pull xzhouqd/qsign:8.9.63
复制代码
1.1.2 从本地存储文件加载镜像

  1. docker load -i xzhouqd_qsign_8.9.63.tar
复制代码
上面提及的示例文件 “xzhouqd_qsign_8.9.63.tar” ,实际上是由 Docker 镜像导出并存储到本地的压缩文件。那么,如许的文件是怎样天生的呢?接下来,我们将渐渐揭示这一过程。
首先,我们需要利用 Docker 的镜像枚举下令来确认目的镜像是否已经存在于本地的 Docker 环境中:
  1. docker images
复制代码
执行的结果如下图:

通过执行上述下令,您将看到一个列表,其中包含了本地已有的所有镜像或指定镜像的信息。假如目的镜像确实存在,它将在列表中显示;否则,需要从远程堆栈(如Docker Hub)拉取或通过其他方式获取(如:1.1.1所述 )。
假设“xzhouqd/qsign:8.9.63”镜像已存在于本地Docker环境中,接下来我们将演示怎样将其导出为.tar文件:
  1. 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 由镜像运行天生容器

  1. docker run -d `# -d 表示保持后台运行` \
  2.         --restart=always `# 表示开机即自动运行` \
  3.         --name bs-qsign `容器名称` \
  4.         -p 18080:8080 `# 端口映射,将容器的 8080 端口映射到宿主机的 18080 端口` \
  5.         -e ANDROID_ID=xxxxxxx `# 此值可以随便设置,但需要和 cqhttp 里的设置一致` \
  6.         xzhouqd/qsign:8.9.63 # 镜像文件
复制代码
小贴士: 在多行Shell下令文件中,欲在行尾利用反斜杠 \ 举行续行的同时添加注释,可于 \ 之前插入一对反引号 ` 包裹的 # 字符来实现,以此实现续行与注释的结合。
至此,bs-qsign 署名服务器已顺利完成搭建。为便于后续举行参数的动态调解、实现与其他容器间设置的统一管理,以及一键启动具有复杂功能的扩展服务,建议将干系参数迁移至设置文件举行妥善存储。
2 创建设置文件:config.sh

此设置文件,由以下几个部分构成
2.1 根本参数

  1. appName="bs-qsign" # 应用名称
  2. appVersion="0.0.1" # 应用版本号
  3. imageName="xzhouqd/qsign:8.9.63" # 镜像名称
  4. containerName="$appName" # 容器名称
复制代码
2.2 docker run 干系设置

通常情况下,我们在设置Docker容器时会涉及以下三个焦点要素:


  • Volumes —— 用于宿主机与容器之间实现文件或目录的双向同步映射,确保数据持久化及共享。在设置文件里以变量 volumes 表示。
  • Ports —— 通过端口映射,使得外部可以或许访问到容器内部运行的服务,实现网络通信。在设置文件里以变量 ports 表示。
  • Environments —— 设置环境变量,为容器内应用程序提供须要的运行时设置信息。在设置文件里以变量 envs 表示。
对于上述各项设置,可根据实际应用场景自由选择实用的项目。对于暂时无需利用的设置项,可以选择对其举行注释以备后续参考,大概直接删除以保持设置文件简便。
  1. # docker run 相关配置(可选项,如为空,可不填)
  2. volumes=(/path_in_host:/path_in_container)
  3. # /path_in_host - 宿主机目录
  4. # /path_in_container - 容器目录
  5. ports=("18080:8080") # 宿主机端口:容器端口
  6. envs=("ANDROID_ID=tanbushi01") # 变量名=变量值
复制代码
上述以圆括号 () 包围的数据结构在Shell脚本中定义了一个数组。其中,用单引号或双引号包裹的文本构成数组的各个元素,多个元素之间以空格分隔。以包含多个端口映射的数组为例:
  1. ports=("18080:8080" "15703:5703")
复制代码
这里,数组 ports 包含两个元素:“18080:8080” 和 “15703:5703”,分别代表将宿主机的18080端口映射到容器的8080端口,以及将宿主机的15703端口映射到容器的5703端口。
雷同地,对于 volumes(卷映射)和 envs(环境变量)数组的定义,只需按照相同的方式指定各自的映射关系或环境变量键值对即可:
  1. volumes=("host_path1:container_path1" "host_path2:container_path2")
  2. 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 脚本是否已执行过:
  1. configured=true
复制代码
当该变量值为 true 时,表明 config.sh 脚本已成功执行过一次,旨在防止后续重复加载或执行设置,确保系统的稳定性和一致性。
终极的config.sh内容如下:
  1. #!/bin/bash# 根本参数appName="bs-qsign" # 应用名称
  2. appVersion="0.0.1" # 应用版本号
  3. imageName="xzhouqd/qsign:8.9.63" # 镜像名称
  4. containerName="$appName" # 容器名称
  5. # docker run 干系设置(可选项,如为空,可不填)ports=("18080:8080")envs=("ANDROID_ID=tanbushi01")# 标记是否已经设置过configured=true
  6. # 标记变量——此脚本已经被执行过
复制代码
3 运行容器的脚本:run.sh

  1. #!/bin/bash
  2. # 运行初始化脚本
  3. . ../../shell-scripts/run_init.sh
  4. # 创建并执行临时文件——实现 docker run 命令(临时文件不是在容器里哦!)
  5. . ../../shell-scripts/run_in_tmp.sh
  6. echo ""
  7. echo "*********************************************************"
  8. echo "成功创建容器:【 $containerName 】!"
  9. echo "*********************************************************"
  10. echo ""
复制代码
3.1 初始化脚本:run_init.sh

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

  1. #!/bin/bash
  2. OS=$(uname)
  3. is_windows=false
  4. case "$OS" in
  5.   Linux) # 在 Linux 系统上运行
  6.     ;;
  7.   Darwin) # 在 macOS 系统上运行
  8.     ;;
  9.   CYGWIN*|MINGW32*|MSYS*|MINGW*) # 在 Windows 系统上运行
  10.     is_windows=true
  11.     ;;
  12.   *)
  13.     echo "Unknown OS: $OS" # 在其他系统上运行
  14.     ;;
  15. esac
  16. # 执行 docker run 命令的临时脚本文件名
  17. shell_script="/tmp/${containerName}_run.sh"
  18. # 输出数组元素生成映射 volume、port、env
  19. function exportMapItems() {
  20.   local script_name=$1 # 脚本文件名
  21.   shift
  22.   local type_prefix=$1 # 类型前缀
  23.    shift
  24.   # 如果是windows,同时$type_prefix是-v 则自动添加斜杠
  25.   if [ "$is_windows" = true ] && [ "$type_prefix" = "-v" ]; then
  26.     auto_slash=/
  27.   else
  28.     auto_slash=""
  29.   fi
  30.   # echo "auto_slash=$auto_slash"
  31.   local -a items=("$@")
  32.   for map_item in "${items[@]}"; do
  33.     # 输出数组元素
  34.     echo "  ${type_prefix} ${auto_slash}${map_item} \" >> $script_name
  35.     # echo "  ${type_prefix} ${auto_slash}${map_item} \"
  36.   done
  37. }
  38. # 创建临时文件:/tmp/_run.sh(不是在容器里哦!)
  39. echo "#!/bin/bash" > $shell_script
  40. echo "" >> $shell_script
  41. echo "docker run -itd \" >> $shell_script
  42. echo "  --restart always \" >> $shell_script
  43. # 写入 volumes,注意,此处只能是-v,不是-V
  44. exportMapItems $shell_script "-v" "${volumes[@]}"
  45. # 写入 ports,注意,此处只能是-p,不是-P
  46. exportMapItems $shell_script "-p" "${ports[@]}"
  47. # 写入 envs,注意,此处只能是-e,不是-E
  48. exportMapItems $shell_script "-e" "${envs[@]}"
  49. # 写入 name
  50. echo "  --name $containerName \" >> $shell_script
  51. # 写入 imageName
  52. echo "  $imageName" >> $shell_script
  53. chmod 755 $shell_script
  54. . $shell_script
  55. rm -f $shell_script
复制代码
4 总结

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

上一篇:docker安装并跑通跑通QQ呆板人实践(1)-前言及展示
下一篇:docker安装并跑通QQ呆板人实践(3)-bs-nonebot搭建


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

何小豆儿在此

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表