From a49ff686e1d9d013e01935d1b5c0959bba56e054 Mon Sep 17 00:00:00 2001 From: Heran Yang Date: Mon, 30 Jun 2025 17:13:37 +0800 Subject: [PATCH] install: update Dockerfile and compose file (#999) --- install/docker/README.md | 43 ++++++++++++-------------- install/docker/backend/Dockerfile | 12 +++++--- install/docker/backend/entrypoint.sh | 5 +-- install/docker/docker-compose.yml | 19 ++++++++---- install/docker/judge/Dockerfile | 23 +++++++------- install/docker/judge/entrypoint.sh | 2 +- install/docker/judge/judge.yaml | 6 ++-- install/docker/judge/mount.yaml | 46 ++++++++++++++++++++++++++++ 8 files changed, 104 insertions(+), 52 deletions(-) create mode 100644 install/docker/judge/mount.yaml diff --git a/install/docker/README.md b/install/docker/README.md index 0132e2bfe..c656fb046 100644 --- a/install/docker/README.md +++ b/install/docker/README.md @@ -1,14 +1,13 @@ ## 首要条件 -## docker 安装方式仅适用于可熟练使用 docker-compose 维护容器的用户,并要求您有基础的错误排查能力 -## 该安装模块非官方维护,即不会提供任何技术支持 -## 普通用户请务必使用自动脚本安装,这可大大提高您一次成功的可能性 +> [!WARNING] +> docker 安装方式仅适用于可熟练使用 docker-compose 维护容器的用户,并要求您有基础的错误排查能力 +> 该安装模块非官方维护,即不会提供任何技术支持 +> 普通用户请务必使用自动脚本安装,这可大大提高您一次成功的可能性 -本文假设您已经安装了`Docker`、`docker-compose`、`git`。 +本文假设您已经安装了 `docker`、`docker-compose`、`git`,**未安装请先安装**。 -**未安装请先安装**。 - -## 开始安装(不建议使用Windows) +## 开始安装(请使用 Linux) 1. 请选择磁盘空间富裕的位置,运行下面的命令。 @@ -18,32 +17,28 @@ `docker-compose up -d` -因为是在本机制作docker镜像,所以耗时可能会比较久。根据网速情况,大约5到30分钟就可以自动搭建完成,全程无需人工干预。 +在本机制作 docker 镜像耗时可能会比较长。根据网络情况,大约 5 到 30 分钟就可以自动搭建完成,全程无需人工干预。 -等命令执行完成,然后运行 `docker ps -a`,当看到所有的容器的状态没有`Exited (x) xxx`就代表 OJ 已经启动成功。 +命令执行完成后运行 `docker ps -a`,当看到所有的容器的状态没有 `Exited (x) xxx` 就代表 OJ 已经启动成功。 ## 注意 -安装过程中,会默认注册一个超级管理员账号,用来做测评账号。用户名:`root`,密码:`rootroot`。**请务必及时修改密码**。修改该账号密码后,请修改`data/judge/config/judge.yaml`中的`password`。否则可能会无法测评。 +安装过程中,会默认注册一个 uid 为 2 的测评账号。用户名:`judge`,密码:`examplepassword`。**请务必及时修改密码**。修改该账号密码后,请修改 `judge/judge.yaml` 中的 `password`。否则可能会无法测评。 ## 测评机默认编译器 -测评机默认安装了以下几个编译器,如有需要,请自行安装。 - -编译器列表: +测评机默认安装了以下编译器,如有需要,请自行安装: 1. gcc 2. python3 3. g++ 4. fp-compiler -5. openjdk-8-jdk-headless -6. python -7. php7.0-cli -8. rustc -9. haskell-platform -10. libjavascriptcoregtk-4.0-bin -11. golang -12. ruby -13. mono-runtime -14. mono-mcs - +5. openjdk-17-jdk-headless +6. php-cli +7. rustc +8. ghc +9. libjavascriptcoregtk-4.0-bin +10. golang +11. ruby +12. mono-runtime +13. mono-mcs diff --git a/install/docker/backend/Dockerfile b/install/docker/backend/Dockerfile index abffcc7d5..084dcba39 100644 --- a/install/docker/backend/Dockerfile +++ b/install/docker/backend/Dockerfile @@ -1,6 +1,8 @@ FROM node:20 -ADD ./entrypoint.sh /root/entrypoint.sh -RUN yarn global add pm2 hydrooj @hydrooj/ui-default -RUN chmod +x /root/entrypoint.sh && \ - mkdir -p /root/.hydro -ENTRYPOINT /root/entrypoint.sh + +COPY ./entrypoint.sh /root/entrypoint.sh + +RUN yarn global add pm2 hydrooj @hydrooj/ui-default && \ + chmod +x /root/entrypoint.sh + +ENTRYPOINT ["/root/entrypoint.sh"] diff --git a/install/docker/backend/entrypoint.sh b/install/docker/backend/entrypoint.sh index 573709cf1..03a1b637b 100644 --- a/install/docker/backend/entrypoint.sh +++ b/install/docker/backend/entrypoint.sh @@ -13,8 +13,9 @@ fi if [ ! -f "$ROOT/first" ]; then echo "for marking use only!" > "$ROOT/first" - hydrooj cli user create systemjudge@systemjudge.local root rootroot - hydrooj cli user setSuperAdmin 2 + hydrooj cli user create systemjudge@systemjudge.local judge examplepassword 2 + hydrooj cli user setJudge 2 + hydrooj cli system set server.host 0.0.0.0 fi pm2-runtime start hydrooj diff --git a/install/docker/docker-compose.yml b/install/docker/docker-compose.yml index 286609444..a7f897c2b 100644 --- a/install/docker/docker-compose.yml +++ b/install/docker/docker-compose.yml @@ -1,7 +1,4 @@ -version: '3.7' - services: - # Warning: mongodb here is not password-protected. # DO NOT EXPOSE THIS SERVICE TO THE PUBLIC. oj-mongo: @@ -21,7 +18,14 @@ services: - ./data/file:/data/file - ./data/backend:/root/.hydro ports: - - "0.0.0.0:80:8888" # In docker mode, change THIS port instead of port in system settings! + - "80:8888" # In docker mode, change THIS port instead of port in system settings! + healthcheck: + test: curl --silent --fail http://localhost:8888/status >/dev/null || exit 1 + interval: 1m30s + timeout: 10s + retries: 3 + start_period: 30s + start_interval: 5s oj-judge: build: ./judge @@ -29,6 +33,9 @@ services: restart: always privileged: true depends_on: - - oj-backend + oj-backend: + condition: service_healthy + restart: true volumes: - - ./data/judge:/root/.config/hydro + - ./judge/judge.yaml:/root/.hydro/judge.yaml + - ./judge/mount.yaml:/root/.hydro/mount.yaml diff --git a/install/docker/judge/Dockerfile b/install/docker/judge/Dockerfile index e6ea2a61b..f807323a1 100644 --- a/install/docker/judge/Dockerfile +++ b/install/docker/judge/Dockerfile @@ -1,28 +1,29 @@ FROM node:20 +COPY ./entrypoint.sh /root/entrypoint.sh + RUN apt-get -qq update && \ apt-get install -y \ gcc \ python3 \ g++ \ fp-compiler \ - openjdk-8-jdk-headless \ - python \ - php7.0-cli \ + openjdk-17-jdk-headless \ + php-cli \ rustc \ - haskell-platform \ + ghc \ libjavascriptcoregtk-4.0-bin \ golang \ ruby \ mono-runtime \ - mono-mcs - -ADD ./entrypoint.sh /root/entrypoint.sh -ADD ./judge.yaml /root/judge.yaml -RUN chmod +x /root/entrypoint.sh + mono-mcs && \ + chmod +x /root/entrypoint.sh && \ + # node is at /usr/local/bin but hydrojudge will find it at /usr/bin + # so make a symlink to it + ln -s /usr/local/bin/node /usr/bin/node RUN yarn global add pm2 @hydrooj/hydrojudge && \ - wget https://github.com/criyle/go-judge/releases/download/v1.8.0/go-judge_1.8.0_linux_amd64 -O /usr/bin/sandbox && \ + wget https://github.com/criyle/go-judge/releases/download/v1.9.4/go-judge_1.9.4_linux_amd64v3 -O /usr/bin/sandbox && \ chmod +x /usr/bin/sandbox -ENTRYPOINT /root/entrypoint.sh +ENTRYPOINT ["/root/entrypoint.sh"] diff --git a/install/docker/judge/entrypoint.sh b/install/docker/judge/entrypoint.sh index 5b6d9319d..ba096a033 100644 --- a/install/docker/judge/entrypoint.sh +++ b/install/docker/judge/entrypoint.sh @@ -1,4 +1,4 @@ #!/bin/sh -pm2 start sandbox +pm2 start sandbox -- -mount-conf /root/.hydro/mount.yaml pm2-runtime start hydrojudge diff --git a/install/docker/judge/judge.yaml b/install/docker/judge/judge.yaml index d5d9b375d..632c8400f 100644 --- a/install/docker/judge/judge.yaml +++ b/install/docker/judge/judge.yaml @@ -2,6 +2,6 @@ hosts: localhost: type: hydro server_url: http://oj-backend:8888/ - uname: root - password: rootroot - detail: true + uname: judge + password: examplepassword + detail: full diff --git a/install/docker/judge/mount.yaml b/install/docker/judge/mount.yaml new file mode 100644 index 000000000..67a7da113 --- /dev/null +++ b/install/docker/judge/mount.yaml @@ -0,0 +1,46 @@ +mount: + - type: bind + source: /bin + target: /bin + readonly: true + - type: bind + source: /lib + target: /lib + readonly: true + - type: bind + source: /lib64 + target: /lib64 + readonly: true + - type: bind + source: /usr + target: /usr + readonly: true + - type: bind + source: /etc + target: /etc + readonly: true + - type: bind + source: /var + target: /var + readonly: true + - type: bind + source: /dev/null + target: /dev/null + - type: bind + source: /dev/urandom + target: /dev/urandom + - type: bind + source: /dev/zero + target: /dev/zero + - type: tmpfs + target: /w + data: size=512m,nr_inodes=8k + - type: tmpfs + target: /tmp + data: size=512m,nr_inodes=8k +proc: true +workDir: /w +hostName: executor_server +domainName: executor_server +uid: 1536 +gid: 1536