声明

本文档非官方文档,为我试坑的经验总结。

本文编写时间 2019.11.04 ,并不一定会随UOJ更新而更新。

由于UOJ需要用SVN传题,并不那么方便。于是我选择转用UOJ社区版。但是UOJ社区版并没有关于如何安装多个Judger的文档。本文是我通过部分UOJ和UOJ社区版的源码,经实践得到。

注意我并不清楚UOJ的具体架构与实现,同时也并不那么熟悉 Docker 。过程中可能有许多不合理的地方,还请谅解。如果有更好的方法或是使用心得,可以与我交流。

在同一台机器上安装

1

首先需要建起一个 judger ,并且让这个 judger 知道 main_server 在哪里。

你需要基于 main_judger 的 conf.json 写一个新的 conf.json :

运行 docker cp <uoj container id>:/opt/uoj/judger/.conf.json ./conf.json 将 main_judger 的 configure 拷贝到当前目录。其中 <uoj container id> 表示 uoj 容器的 id 。

如果你不知道 uoj 容器的 id ,可以 docker ps 来查看正在运行的容器,或是 docker ps -a 来看所有的容器。

然后修改 conf.json 里这个几个值:

  • "uoj_host" : 改为你 uoj 的 ip (注意不是你主机的ip,而是那个容器的ip);
  • "judger_name" : 起一个新名字,如 judger1 ;
  • "judger_password" : 密码,如 H3b01oSP2Y5KzL4l1GYrA37jpgeQQLuS (我随的)

你可以这样获取一个docker容器的ip:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' <container-id>

记住你修改的这些东西。

2

然后根据UOJ社区版的 Dockerfile ,建立一个 judger 的 image 。

这是 UOJ-System 那个 git 中的 judger 安装文件。

FROM ubuntu:18.04
MAINTAINER MascoSkray <MascoSkray@gmail.com>
ARG CLONE_ADDFLAG WORKDIR /opt
#Update apt and install git
RUN apt-get update && apt-get install -y git
#Clone the latest UOJ Community verison to local
RUN git clone https://github.com/UniversalOJ/UOJ-System.git --depth 1 --single-branch ${CLONE_ADDFLAG} uoj
#Install environment and set startup script
RUN cd uoj/install/judger && sh install.sh -p && echo "\
#!/bin/sh\n\
if [ ! -f \"/opt/uoj/judger/.conf.json\" ]; then\n\
cd /opt/uoj/install/judger && sh install.sh -i\n\
fi\n\
service ntp start\n\
su judger -c \"/opt/uoj/judger/judge_client start\"\n\
exec bash\n" >/opt/up && chmod +x /opt/up ENV LANG=C.UTF-8 TZ=Asia/Shanghai
EXPOSE 2333
CMD /opt/up

我们需要在 Install && Set Startup 之前加上一句话:

COPY conf.json /opt/uoj/judger/.conf.json

这是把配置放到 judger 里面。

然后构建这个镜像:

docker build -f Dockerfile .

Dockerfile 就是你更改之后的文件,同时不要漏掉那个点。

等待一会儿 ,如果构建成功,你能看到 Successfully built ...

3

运行 judger : docker run -it --cap-add SYS_PTRACE <image id>

其中 <image id> 是你刚刚构建的 judger 镜像 id 。这样是直接进入docker 终端,你可以看看有没有报错。或者 docker run -dit --cap-add SYS_PTRACE <image id> 让它直接在后台运行。

如果你在最后测试的时候遇到新加的评测机 judgement failed ,并且 fail to show details ,那么多半是忘记加 --cap-add SYS_PTRACE

4

最后你要在 main_server 上操作一下,让它知道又有一个 judger 了。

首先 docker exec -it uoj /bin/bash 来进入容器。

执行 mysql -p app_uoj233 来进入数据库。默认密码为 root

运行 insert into judger_info (judger_name, password, ip) values ('<judger_name>', '<password>', '<ip>');

其中 <judger_name> 是刚才新 Judger 的名字, <password> 是新 judger 的密码, <ip> 是新 judger 的 IP(同样是容器的ip)。最后的命令可能是这样的:

insert into judger_info (judger_name, password, ip) values ('judger1', 'H3b01oSP2Y5KzL4l1GYrA37jpgeQQLuS', '172.17.0.3');

你应该能在网页上 你的账号->系统管理->评测机管理 里面看到这个评测机了。

然后随便 rejudge 一道题看看评测机正不正常?

在不同机子上安装

我决定先

坑着

最新文章

  1. Ubuntu学习——第一篇
  2. winform控件
  3. java操作字符串,重点是记录一次使用replaceAll对字符串的操作
  4. JavaScript 跨域:window.postMessage 实现跨域通信
  5. 微软Azure云主机及blob存储的网络性能测试
  6. 基于Struts2 的日志管理系统的Java实现
  7. win7 点IE浏览器无法打开
  8. hdu1671字典树
  9. Netty源码 服务端的启动
  10. Jenkins 配置 Git 错误解决:CAfile: C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
  11. spring依赖注入之构造函数注入,set方法注入
  12. RocketMq发送消息出现com.alibaba.rocketmq.client.exception.MQBrokerException: CODE: 2 DESC: [TIMEOUT_CLEAN_QUEUE]broker busy, start flow control for a while, period in queue: 201ms, size of queue: 1
  13. 【JVM】关于类加载器准备阶段的一道面试题目
  14. Ex0203
  15. linux find 只获取文件名而去除路径
  16. VDB R&amp;D
  17. poj1236/luogu2746 Network of Schools (tarjan)
  18. cxgrid过滤使用心得
  19. 002.MMM高可用MySQL简介
  20. TF-IDF理解及其Java实现

热门文章

  1. Struts2的学习自我总结
  2. SWATS算法剖析(自动切换adam与sgd)
  3. js文字跑马灯
  4. .Net C# 读取xml
  5. RabbitMq 开始&lt;一&gt;
  6. NodeJS express框架的使用
  7. mycat sql timeout 问题解决
  8. GC原理图
  9. react快速上手一(使用js语法,创建虚拟DOM元素)
  10. .NET 使用事物调用存储过程