使用容器化技术在 Linux 服务器上部署 OlivaDice

@2023年8月4日 989字 §技术 #Python #Linux #骰娘
目录
  • 容器结构
  • Dockerfile
  • OlivaDice.py
  • docker-compose.yml
  • 骰娘……启动!
  • 小问题
  • 最近跑团小组吸收了新鲜的血液又开始动起来了,但是旧的骰娘却寄了,在网上搜索的时候刚好就遇到了青果核骰子,下载了 Win64 版挂在 KOOK 上玩了玩感觉还不错,于是就想着把它挂到阿里云上了。

    但是当下载了 官方提供的 Linux 版 后,塞到服务器上却死活也运行不了,一直在报缺少 tkinter 组件,我寻思着服务器为啥要图形界面,于是把 OlivaDiceNativeGUI 插件给去掉了,但是还是无法运行,依旧报 tkinter 错误。

    由于整个 OlivaDiceCore 实质上就是 OlivOS 的一个插件,所以干脆就按照部署 OlivOS 的方法把骰娘给架好得了,而且还可以简单打包个容器以避免污染默认 Python 环境。

    容器结构

    我使用 Docker Compose 来部署和构建容器,因此除了核心所需要的一些文件和文件夹,还需要专门准备一个构建文件夹:

    +-- OlivaDice
        +-- build                         # 构建文件夹
        |   +-- Dockerfile                # Dockerfile 文件
        |   +-- OlivaDice.py              # 启动入口文件
        +-- conf                          # 配置文件夹
        |   +-- account.json              # 账户数据
        +-- data                          # 数据文件夹
        +-- lib                           # 库文件夹
        +-- logfile                       # 日志文件夹
        +-- plugin                        # 插件文件夹
        |   +-- app
        |       +-- ChanceCustom.opk      # OlivaDice 子模块
        |       +-- OlivaDiceCore.opk     # OlivaDice 核心模块
        |       +-- OlivaDiceJoy.opk      # OlivaDice 子模块
        |       +-- OlivaDiceLogger.opk   # OlivaDice 子模块
        |       +-- OlivaDiceMaster.opk   # OlivaDice 子模块
        |       +-- OlivaDiceOdyssey.opk  # OlivaDice 子模块
        +-- docker-compose.yml            # Docker compose 文件

    其中,所有的 OlivaDice 模块你都可以在 Github 或 青果核论坛 上找到,账户数据你可能需要手动填写,毕竟服务器上可没有图形界面给你玩,当然我就直接从之前在 Windows 上玩的账户数据拷贝过去了。

    因此你只需要准备三个文件:build/Dockerfilebuild/OlivaDice.pydocker-compose.yml

    Dockerfile

    Dockerfile 是用来构建容器的,根据青果核的要求,我使用的是 Python 11,所以要从 Python 11 镜像进行构建。需要写的内容很少:

    FROM python:3.11-slim
    WORKDIR /app
    COPY OlivaDice.py .
    RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple olivos
    CMD ["python", "OlivaDice.py"]

    这里我将工作目录设为 /app,然后把外部的 OlivaDice.py 入口文件拷贝进镜像,然后使用 pip 安装 olivos 核心。这里我用了清华镜像源来加速,要不然不使用科学上网直接从 PYPI 拉取数据简直慢到天际……

    最后使用 Python 来执行入口文件就行。

    OlivaDice.py

    入口文件是容器启动时执行的,同时也非常简单,因为青果核已经把能做的都帮我们做到了,直接照抄 Github 样例代码即可:

    import OlivOS
    
    if __name__ == '__main__':
    	OlivOSTarget = OlivOS.bootAPI.Entity()
    	OlivOSTarget.start()

    docker-compose.yml

    简单照抄即可,注意我们需要把文件夹挂载到对应的位置:

    version: "3.9"
    
    services:
      oliva-dice:
        build:
          context: ./build
          dockerfile: Dockerfile
        container_name: oliva-dice
        restart: always
        volumes:
          - ./conf:/app/conf
          - ./plugin:/app/plugin
          - ./data:/app/data
          - ./lib:/app/lib
          - ./logfile:/app/logfile

    骰娘……启动!

    直接在 docker-compose.yml 目录下执行:

    sudo docker compose up

    等待很长一段时间进行构建和启动,当你看到 OlivOS 的大 Logo 出现时,你就已经成功了!

    小问题

    当你使用容器化技术启动 OlivOS 之后,如果你试图使用 Docker 的 logs 命令查看日志:

    sudo docker logs <你的容器 ID>

    你会发现日志是残缺的!在 OlivOS 装载完账号之后,所有的信息都消失了……

    这时候你需要通过 logfile 文件夹来查看青果核输出的日志:

    cat logfile/OlivOS_logfile_{某一个日期}.log

    因为青果核用多进程来运行机器人,但是 Docker 日志只能捕获主进程的消息,所以你只能通过文件的方式来获取完整日志。
    只能说这是 Python 的缺点

    正在加载索引……