NoneBot2 是一个现代、跨平台、可扩展的 Python 聊天机器人框架(下称 NoneBot),它基于 Python 的类型注解和异步优先特性(兼容同步),能够为你的需求实现提供便捷灵活的支持。同时,NoneBot 拥有大量的开发者为其开发插件,用户无需编写任何代码,仅需完成环境配置及插件安装,就可以正常使用 NoneBot。
下面将演示如何在Docker 里安装 Nonebot 框架
1 关于 bs-nonebot 的镜像配置
需要注意的是,NoneBot 仅支持 Python 3.8 以上版本
下面是 Dockerfile 的内容:
# 使用官方的轻量级基础镜像
FROM alpine:3.10
# 定义作者信息
LABEL MAINTAINER="tanbushi@qq.com"
# 设置环境变量
ENV WORK_DIR /app/bs-nonebot
# 设置工作目录
WORKDIR $WORK_DIR
# 更新系统
RUN echo "https://mirrors.ustc.edu.cn/alpine/v3.13/main" > /etc/apk/repositories \
&& echo "https://mirrors.ustc.edu.cn/alpine/v3.13/community" >> /etc/apk/repositories \
&& apk update && apk upgrade \
&& apk add --no-cache \
bash \
python3=3.8.15-r0 \
py3-pip \
&& pip3 install nonebot
上面的 Dockerfile 中,配置了清华的源,安装了 bash、python3(为了版本统一,指定了 3.8.15-r0)、pip、nonebot。
2 配置文件 config.sh
此模块配置文件内容和上一篇的 qsign 模块的内容差不多。此模块少了一个环境变量定义(-e),多了一个目录映射定义(-v)。内容如下:
#!/bin/bash
# 基本参数
appName="bs-nonebot" # 应用名称
appVersion="0.0.1" # 应用版本号
imageName="$appName:$appVersion" # 镜像名称
containerName="$appName" # 容器名称
# docker run 相关配置(可选项,如为空,可不填)
# 挂载目录配置,形式为:宿主机目录:容器目录
# 下面的路径用到了 pwd 命令,默认要求当前脚本文件和 volumes 目录同在项目目录下(本例项目目录为 bs-nonebot 目录)
volumes=( \
"`pwd`/volumes/source:/app/bs-nonebot/source" \
)
# 端口映射配置,形式为:宿主机端口:容器端口
ports=( \
"15703:5703" \
)
# 环境变量配置
# envs=( \
# "ENV1=value1" \
# "ENV2=value2" \
# )
configured=true # 标记变量——此脚本已经被执行过
注意:
上面文件里volumes数组里用到了 pwd,这里要求 .sh 脚本文件和 volumes 目录同在 项目目录 bs-nonebot 下,如下图红框内所示:
3 运行 build.sh 生成 Docker 镜像
#!/bin/bash
set -e # 遇到错误时退出脚本
# 判断是否运行过配置文件 config.sh,如果未运行过,则运行配置文件
if [ -z "$configured" ]; then
. ./config.sh
# configured=true # 设置一个标志,表示已经运行过配置文件
fi
# 检查Docker命令是否可用
if ! command -v docker &> /dev/null; then
echo "Docker 命令不可用,请确保已经安装并启动了Docker。"
exit 1
fi
# 检查 Docker 是否在运行
if ! docker info > /dev/null 2>&1; then
echo "Docker 没用运行。请启动 Docker 再试!"
exit 2
fi
# 判断 Dockerfile 文件是否存在
if [ ! -f "Dockerfile" ]; then
echo "Dockerfile 文件不存在。请检查!"
exit 3
fi
# 构建镜像,注意此处用到了
docker build -t $imageName .
echo ""
echo "*********************************************************"
echo "成功生成 Docker 镜像:【 $imageName 】!"
echo "*********************************************************"
echo ""
4 运行 run.sh 创建容器
脚本 run.sh 内容为:
#!/bin/bash
# 运行初始化脚本
. ../../shell-scripts/run_init.sh
# 创建并执行临时文件——实现 docker run 命令(临时文件不是在容器里哦!)
. ../../shell-scripts/run_in_tmp.sh
echo ""
echo "*********************************************************"
echo "成功创建容器:【 $containerName 】!"
echo "*********************************************************"
echo ""
运行后,即可创建容器。
注意:在创建 -v 映射时,在 windows 环境下的 git bash 里执行脚本,目录前必须是双斜杠,即 //xxx,在 run_in_tmp.sh 文件里已经做了相应处理。请参见上一篇docker安装并跑通QQ机器人实践(2)-签名服务器bs-qsign搭建里的相关代码。
5 编写 bs-nonebot 最简测试代码
做了 -v 目录映射后,宿主机项目目录 bs-nonebot 下的 volumes/source 目录和 /app/bs-nonebot/source 建立了映射关系,在宿主机 source 目录下的修改,会直接映射到容器里。在宿主机 source 目录下创建 bot.py 测试文件,内容如下:
import nonebot
# 主程序入口
if __name__ == '__main__':
# 初始化nonebot
nonebot.init()
# 加载内置插件
nonebot.load_builtin_plugins()
# 启动nonebot,监听0.0.0.0:5703
nonebot.run(host='0.0.0.0', port=5703)
进入 bs-nonebot 容器,可以看到新创建的 bot.py 文件。如下图:
这段Python代码是nonebot框架的主程序入口。
首先导入nonebot模块。
使用if name == ‘main’:来作为程序的入口。
调用nonebot的init()方法来初始化nonebot。
调用nonebot的load_builtin_plugins()方法来加载内置插件。
调用nonebot的run()方法来启动nonebot,并监听0.0.0.0:5703端口,并且在宿主机的15703上访问到该端口。
6 运行 bot.py
python3 bot.py
运行成功!见下图:
上一篇:docker安装并跑通QQ机器人实践(2)-签名服务器bs-qsign搭建
下一篇:docker安装并跑通QQ机器人实践(4)-bs-cqhttp搭建