XiaBee's Studio.

Docker搭建Hydro-OJ系统

字数统计: 1.1k阅读时长: 5 min
2022/04/29

Hydro简介

  • Hydro是目前来看比较新的一款开源Online Judge系统
  • 目前官网有常见的安装方式,但是Docker的支持不是很好,于是我自己在官网架构基础上,重新编写了一下容器部署。

image.png

使用方式

  • 直接使用docker-compose运行容器,在本地构建镜像

    1
    2
    3
    git clone https://github.com/xiabee/Hydro-Docker
    cd Hydro-Docker
    docker-compose up -d
  • 没有报错就是成功(x):

    1
    docker-compose ps

    image.png

聊聊编写过程

  • 准确的说所有模块的测试完全靠自己,全网没有找到相关的报错,可能是因为官方并不打算提供容器安装的技术支持……

  • 于是有了以下内容(都是我遇到的bug,大家构建过程中可以参考一下

构建速度较慢

  • 问题描述:如题

  • 解决方案:这个直接给Dockerfile换源就好,找一个合适的源,比如清华源:

    1
    2
    3
    RUN sed -i "s/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/g" /etc/apt/sources.list && \
    sed -i "s/security.debian.org/mirrors.tuna.tsinghua.edu.cn/g" /etc/apt/sources.list && \
    apt-get update && apt-get install -y --no-install-recommends && apt upgrade -y

    同时给宿主机配置容器加速器,这里以阿里云、Ubuntu为例:

1
2
3
4
5
6
7
8
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ee1z0bm0.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

测评机不响应

  • 问题描述:各个容器运行正常,但是测评机一直处于不工作状态,即提交代码无法测评

    Error: Request failed with status code 404

    docker-compose logs | grep judge查看测评机容器日志,发现以下内容:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    oj-judge    | Unhandled Rejection at: Promise  Promise {
    oj-judge | <rejected> Error: Request failed with status code 404
    oj-judge | at createError (/usr/local/share/.config/yarn/global/node_modules/axios/lib/core/createError.js:16:15)
    oj-judge | at settle (/usr/local/share/.config/yarn/global/node_modules/axios/lib/core/settle.js:17:12)
    oj-judge | at IncomingMessage.handleStreamEnd (/usr/local/share/.config/yarn/global/node_modules/axios/lib/adapters/http.js:322:11)
    oj-judge | at IncomingMessage.emit (events.js:412:35)
    oj-judge | at endReadableNT (internal/streams/readable.js:1334:12)
    oj-judge | at processTicksAndRejections (internal/process/task_queues.js:82:21) {
    oj-judge | config: {
    oj-judge | transitional: [Object],
    oj-judge | adapter: [Function: httpAdapter],
    oj-judge | transformRequest: [Array],
    oj-judge | transformResponse: [Array],
    oj-judge | timeout: 30000,
    oj-judge | xsrfCookieName: 'XSRF-TOKEN',
    oj-judge | xsrfHeaderName: 'X-XSRF-TOKEN',
    oj-judge | maxContentLength: -1,
    oj-judge | maxBodyLength: -1,
    oj-judge | validateStatus: [Function: validateStatus],
    oj-judge | headers: [Object],
    oj-judge | baseURL: 'http://oj-backend:8888/',
    oj-judge | method: 'post',
    oj-judge | url: 'login',
    oj-judge | data: '{"uname":"root","password":"rootroot","rememberme":"on"}'
    oj-judge | },

   注意此时报错:oj-judge在不断请求http://oj-backend:8888/,但是返回值一直是404,然而观察到oj-backend并没有暴露8888端口……发现问题所在!

  • 解决方案:在docker-compose中暴露oj-backend的服务端口:
    1
    2
    3
    4
    5
    6
    7
    # main site
    oj-backend:
    build: ./backend
    container_name: oj-backend
    ...
    expose:
    - 8888

server User: 0(Guest) get: /judge/files You don’t have the required privilege. [ 512 ]

docker-compose logs | grep backend查看后端容器日志,发现以下内容:

1
2
3
4
5
6
7
8
oj-backend  | [E]  server  User: 0(Guest) get: /judge/files You don't have the required privilege. [ 512 ]
oj-backend | [E] server User: 0(Guest) get: /judge/files You don't have the required privilege. [ 512 ]
oj-backend | [E] server User: 0(Guest) get: /judge/files You don't have the required privilege. [ 512 ]
oj-backend | [E] server User: 0(Guest) get: /judge/files You don't have the required privilege. [ 512 ]
oj-backend | [E] server User: 0(Guest) get: /judge/files You don't have the required privilege. [ 512 ]
oj-backend | [E] server User: 0(Guest) get: /judge/files You don't have the required privilege. [ 512 ]
oj-backend | [E] server User: 0(Guest) get: /judge/files You don't have the required privilege. [ 512 ]
oj-backend | [E] server User: 0(Guest) get: /judge/files You don't have the required privilege. [ 512 ]

此时推断,测评机在抓取后端请求,但是后端并没有权限写入测评机

结合上面测评机容器请求内容:

1
2
oj-judge    |       url: 'login',
oj-judge | data: '{"uname":"root","password":"rootroot","rememberme":"on"}'

推测测评机设置的账号密码与后端不匹配

  • 解决方案:修改./data/judge/judge.yamlunamepassword修改为对应管理员账号的用户名和密码:

    1
    2
    3
    4
    5
    6
    7
    hosts:
    localhost:
    type: hydro
    server_url: http://oj-backend:8888/
    uname: root
    password: rootroot
    detail: true
  • 然后重启容器就可以正常测评了:docker-compose restart

image.png

其他问题

  • 暂时不记得了,想起来了来写
CATALOG
  1. 1. Hydro简介
  2. 2. 使用方式
  3. 3. 聊聊编写过程
    1. 3.1. 构建速度较慢
    2. 3.2. 测评机不响应
      1. 3.2.1. Error: Request failed with status code 404
      2. 3.2.2. server User: 0(Guest) get: /judge/files You don’t have the required privilege. [ 512 ]
    3. 3.3. 其他问题