制作一个一键运行的10多M的go-cqhttp最简docker镜像

一直有个想自己部署一个QQ机器人,虽然成功完成在Windows环境下基于 go-cqhttp 的搭建工作。但考虑到我有一台常年在线的群晖 NAS,并且已经配置并启用了 Docke r服务,可否将go-cqhttp 迁移至 NAS 上的 Docker 容器中运行吗呢?同时,为进一步提升便捷性,计划将 go-cqhttp 的配置文件整合入容器内,以便一键部署,避免繁琐的配置步骤。在此过程中,秉持精简原则,在确保功能完备的同时,力求最大限度地压缩镜像体积,实现轻量化部署。

重要提示:使用 go-cqhttp 或 其他工具,都有可能造成 QQ 账号被风控, 请谨慎使用。建议用小号,不要因 QQ 号被风控造成损失!!!

此次目标分两步,第一步实现在 alpine 镜像上安装 go-cqhttp,并启动、配置好 go-cqhttp,确保跟随容器启动、停止,只实现QQ信息监听的最简功能,后续功能另行测试;第二步实现集成打包一个极简的 Docker 镜像,功能和第一步实现的一致。

1 在alpine镜像上安装 go-cqhttp

1.1 拉取 alpine 镜像

习惯指定版本号,避免版本更新导致镜像失效,此次选用 alpine:3.10。

docker pull alpine:3.10

1.2 使用基础镜像创建容器

下面代码的功能是:

  • 使用 alpine 镜像创建容器
  • 指定容器名称为 go-cqhttp-alpine
  • 将用户的 home 目录下的 docker-volumes/go-cqhttp-alpine 目录挂载到容器的 /app/go-cqhttp-alpine 目录
docker run -itd -v ~/docker-volumes/go-cqhttp-alpine:/app/go-cqhttp-alpine --name go-cqhttp-alpine alpine:3.10

1.3 下载 go-cqhttp

在 github 上的下载页地址为:https://github.com/Mrs4s/go-cqhttp/releases/,需要根据需求选择对应的版本号。我的 mac 电脑和 NAS 都可以使用 amd64 的版本。下载地址为:https://github.com/Mrs4s/go-cqhttp/releases/download/v1.0.0-rc3/go-cqhttp_linux_amd64.tar.gz

1.4 解压 go-cqhttp

解压到当前电脑系统的 ~/docker-volumes/go-cqhttp-alpine 目录下,由于此目录为 docker 挂载的目录,所以文件在docker内部也能看到,并可直接进行操作。

1.5 使用 docker exec 命令进入容器内部

docker exec -it go-cqhttp-alpine /bin/sh

打开的终端如下图所示:
图1  docker exec 进入容器内部

图1 docker exec 进入容器内部

进入容器内部目录:/app/go-cqhttp-alpine,看到文件列表如下:(这些文件是刚才通过挂载目录拷入的)
图2  压缩包解压后的文件列表

图2 压缩包解压后的文件列表

1.6 在容器内部启动 go-cqhttp

cd /app/go-cqhttp-alpine
./go-cqhttp

图3  选择通信方式

图3 选择通信方式

选:0,回车

图4  选择后执行自动生成 config.yml

图4 选择后执行自动生成 config.yml

ctrl + c,退出,重新执行:./go-cqhttp

./go-cqhttp

图5  协议选择不匹配,需要修改设备配置文件 device.json

图5 协议选择不匹配,需要修改设备配置文件 device.json

  • 账号密码未配置, 将使用二维码登录
    为了简化配置,也为了方便分享,就不配置 config.yml 了,直接使用默认配置,将启用二维码登录
  • 虚拟设备信息不存在, 将自动生成随机设备
    由于默认没有配置虚拟设备,所以会出现此提示,同时在当前目录下会生成 device.json 的文件
  • no usable sign server
    未配置签名服务器或签名服务器不可用, 这可能会导致登录 45 错误码或发送消息被风控,目前只是简单的提示,不会影响使用。但后期还是要考虑解决前面服务器的问题
  • 当前协议不支持二维码登录, 请配置账号密码登录
    这个可以通过后面配置 device.json 来解决。如果需要配置用户名密码的话,请自行修改 config.yml 和 device.json 文件。

1.7 配置 device.json

图6  修改 device.json 文件

图6 修改 device.json 文件

编辑 device.json 文件

图7  更改协议编号

图7 更改协议编号

将 protocol 改为 2

1.8 再次启动 go-cqhttp

./go-cqhttp

出现扫码二维码提示,用手机 QQ 扫码登录。提示在手表上登录,因为选择的协议 2 就是智能手表登录协议。
图8  扫码后成功登录 QQ

图8 扫码后成功登录 QQ

至此,完成第一步目标:在docker里安装go-cqhttp,并成功登录。实现了监控 QQ 群消息和私聊消息的功能。所有配置文件,仅仅改动了一个字符,所以很容易实现配置文件的一键 docker 镜像部署。

下面开始第二个目标。

2 创建镜像

实现机理,制作一个 Dockerfile 文件,引用:alpine:3.10 作为初始镜像,将下面的文件通过 COPY 写入 Dockerfile 文件,并保存。再用 docker build 命令构建镜像即可。
图9  正常运行时的文件结构

图9 正常运行时的文件结构

上图中,有些是运行后产生的数据文件,初始镜像中并不需要这些文件,所以可以删除。包括:data 目录、logs 目录、session.token 文件。

2.1 文件准备

  • 在任意位置创建一个文件夹,名称可随便定,此处命名为 build-files,把 签名的挂载目录 go-cqhttp-alpine 文件夹拷贝进去
  • 在文件夹 build-files 中创建一个 Dockerfile 文件,并写入如下内容:
FROM alpine:3.10

WORKDIR /app/go-cqhttp-alpine

COPY go-cqhttp-alpine /app/go-cqhttp-alpine/

最后形成如下目录结构:
图10  为编译镜像准备的文件结构

图10 为编译镜像准备的文件结构

2.2 构建镜像

在终端窗口中 cd 到 build-files 文件夹,执行:

docker build -t go-cqhttp-alpine:1.0.0 .

镜像构建成功!生成的镜像为 go-cqhttp-alpine:1.0.0。

2.3 运行容器

docker run -itd --name go-cqhttp-alpine go-cqhttp-alpine:1.0.0

容器成功运行!

2.4 进入容器运行 go-cqhttp

docker exec -it go-cqhttp-alpine /bin/sh

进入容器内部,执行:

cd /app/go-cqhttp-alpine
./go-cqhttp

出现下面的扫码登录提示:
图11  扫码登录

扫码登录

扫码登录即可。如果要退出,请输入 ctrl + c。

3 总结

目前仅仅是安装成功,并实现了:

  • 登录功能
    下一步可以配置 config.yml 文件,实现用户名密码自动登录,就无需每次扫码登录了。此部分可以自行尝试。
  • 消息接收
    实现了 QQ 群消息和私聊消息的接收。下一步可以实现消息的转发,实现群聊和私聊的转发。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

rasa trian 报错解决---Project validation completed with errors.

rasa train 过程中:出现一下问题; Project validation completed with errors. 解决措施:python 3.10版本,rasa 3.6.19, 降低版本 pip3 install rasa3.5.17 -i https://pypi.tuna.tsinghua.edu.cn/simple成功解决

洛谷P1007独木桥(暴力枚举)

题目描述: 说明提示: 思路: 本题的核心思想在于:两人相遇后,转身不计入时间,所以我们可以看作直接穿过去,那么一个人走下桥的时间有两种,一个是本身所在位置x,另一个是l…

CSS基础选择器 小案例复习(画三个小盒子)

(大家好,前面我们学习了基础的选择器,俗话说:温故而知新。所以今天我们将通过小案例来复习前面学过的小知识点。另,十分感谢大家对我文章的支持❤️) 通过这个案例复习两个地方: 类选择器的使用…

MySQL的基本操作(超详细)

👨‍💻作者简介:👨🏻‍🎓告别,今天 📔高质量专栏 :☕java趣味之旅 📔(零基础)专栏:MSQL数据库 欢迎🙏点赞&…

基于k8s的web服务器构建

文章目录 k8s综合项目1、项目规划图2、项目描述3、项目环境4、前期准备4.1、环境准备4.2、ip划分4.3、静态配置ip地址4.4、修改主机名4.5、部署k8s集群4.5.1、关闭防火墙和selinux4.5.2、升级系统4.5.3、每台主机都配置hosts文件,相互之间通过主机名互相访问4.5.4、…

iMessage是怎么成为“黑灰产的乐园”

垃圾/骚扰/色情/钓鱼短信已经成为苹果手机iMessage无法解决的难题。几乎每一位iPhone用户都曾收到过这类短信,被吐槽“每一个iPhone里都藏着一个澳门葡京赌场”。 对于这些垃圾短信,最好的办法就是别点开直接删除,上当/被骗的第一步就是从点开…

go包下载时报proxyconnect tcp: dial tcp 127.0.0.1:80: connectex错误的解决方案

一大早的GoLand就开始抽风了,好几个文件import都红了,于是我正常操作点击提示的sync,但是却报了一堆错: go: downloading google.golang.org/grpc v1.61.1 go: downloading google.golang.org/genproto v0.0.0-20240228224816-df9…

Lambda表达式,Stream流

文章目录 Lambda表达式作用前提函数式接口特点 语法省略模式和匿名对象类的区别 Stream流思想作用三类方法获取方法单列集合(Collection[List,Set双列集合Map(不能直接获取)数组同一类型元素(Stream中的静态方法) 常见的中间方法终结方法收集方法 Optional类 Lambda表达式 作用…

C 回调函数的两种使用方法

对回调(callback)函数的一点粗陋理解,在我小时候,隔壁村有家月饼小作坊(只在中秋那段时间手工制作一些月饼出售,后来好像不做了),做出的月饼是那种很传统很经典的款式,里…

C 练习实例97 - 读磁盘 写磁盘

题目&#xff1a;从键盘输入一些字符&#xff0c;逐个把它们送到磁盘上去&#xff0c;直到输入一个‘#’为止 在桌面新建一个hello.txt文件&#xff0c;内容示例&#xff1a; 代码&#xff1a; #include <stdio.h> #include <stdlib.h>int main() {FILE *fp; //文…

CSS样式-字体类型,文本对齐,外观修饰,文本缩进,文本行间距,外部引用css样式

字体类型和字体属性调整 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Css字体类型大小</title&…

【软路由】iStoreOS全量备份或数据迁移思路

背景&#xff1a;之前是在我的i3小主机上面搭建了iStoreOS&#xff0c;因为有段时间爱折腾&#xff0c;于是乎不知道什么情况就造成首页无法登录&#xff0c;改了的东西无法回滚&#xff0c;好在使用“万能重启”法又可以登录了&#xff0c;于是我就在想把这玩意定期备份一下。…

算法打卡day25

今日任务&#xff1a; 1&#xff09;491.递增子序列 2&#xff09;46.全排列 3&#xff09;47.全排列 II 491.递增子序列 题目链接&#xff1a;491. 非递减子序列 - 力扣&#xff08;LeetCode&#xff09; 给定一个整型数组, 你的任务是找到所有该数组的递增子序列&#xff0c…

选数异或(DP)

题目描述 给定一个长度为 n 的数列 A1, A2, , An 和一个非负整数 x&#xff0c;给定 m 次查询, 每次询问能否从某个区间 [l,r] 中选择两个数使得他们的异或等于 x 。 输入格式 输入的第一行包含三个整数 n, m, x 。 第二行包含 n 个整数 A1, A2, , An 。 接下来 m 行…

Redis高可用技术

一.Redis高可用介绍&#xff1a; 高可用是指&#xff1a;服务器正常访问的时间 衡量的标准是&#xff1a;在多长时间内可以提供正常服务99.9%、99.99%、99.999%等等 但是在Redis语境中&#xff0c; 高可用的含义似乎要宽泛一些&#xff0c;除了保证提供正常服务(如主从分离、…

Find a way (DFS BFS)

//新生训练 #include <iostream> #include <algorithm> #include <queue> using namespace std; using PII pair<int, int>;const int N 205; const int inf 0x3f3f3f3f; int n, m; int l;int dis1[N][N]; int dis2[N][N];int dx[] {0, 0, -1, 1};…

springboot实战---6.项目发布

&#x1f388;个人主页&#xff1a;靓仔很忙i &#x1f4bb;B 站主页&#xff1a;&#x1f449;B站&#x1f448; &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;Springboot &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&…

深入C语言:探究static关键字的奥秘

文章目录 一、链接属性二、static变量1、定义静态局部变量2、在函数内部使用静态变量3、函数中静态局部变量与递归 三、static变量与全局变量的区别1、存储期与生命周期2、可见性与作用域3、使用场景4、静态与动态内存分配 注意事项 当用于不同的上下文环境时&#xff0c; sta…

nginx配置多vue项目

1. 找到linux docker安装好的nginx目录文件 进入nginx内 把打包好的vue项目放在html文件下 如上 三个文件夹下对应着三个不同的vue项目 2. 配置default.conf的配置文件&#xff0c; 一个nginx配置文件可以多个项目进行代理 进入到conf 找到conf.d下面的default.conf 文件…

Springboot自动获取接口实现

ServiceLoader加载接口实现步骤 1.编写接口 public interface CommunicationAdapterFactory {void setKernel(LocalKernel kernel);boolean providesAdapterFor(Vehicle vehicle);BasicCommunicationAdapter getAdapterFor(Vehicle vehicle); }2.编写实现 // 实现类 1 publi…