go-judge

go-judge

判题机

github仓库:https://github.com/criyle/go-judge

中文文档:https://docs.goj.ac/cn/

安装运行

docker hub:https://hub.docker.com/r/criyle/go-judge

  1. 在docker hub里找到pull命令下载镜像

  2. 执行命令创建并运行容器

    1
    2
    3
    4
    5
    // 测试用,前台运行,退出后会删除容器
    docker run -it --rm --privileged --shm-size=256m -p 5050:5050 --name=go-judge criyle/go-judge

    // 后台运行,不会删除容器
    docker run -d --privileged --shm-size=256m -p 5050:5050 --name=go-judge criyle/go-judge
    • -it:让容器保持标准输入通道打开,配一个伪终端方便操作
    • –rm:容器退出后自动删除,不会保留历史或文件
    • –privileged:给容器最高系统权限
    • –shm-size:设置容器的 共享内存大小
  3. 测试:localhost:5050/version

发送请求

编译运行C++

  1. 安装运行环境

    1
    2
    3
    4
    5
    // 进入容器
    docker exec -it go-judge /bin/bash

    // 更新本地的软件包索引和安装 GNU C++ 编译器
    apt update && apt install g++
  2. 编译请求:发送请求POST http://localhost:5050/run

    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
    {
    "cmd": [{
    "args": ["/usr/bin/g++", "a.cc", "-o", "a"], // 运行参数
    "env": ["PATH=/usr/bin:/bin"], // 在指定的目录下找命令
    "files": [{
    "content": ""
    }, {
    "name": "stdout",
    "max": 10240
    }, {
    "name": "stderr",
    "max": 10240
    }],
    "cpuLimit": 10000000000,
    "memoryLimit": 104857600,
    "procLimit": 50,
    "copyIn": {
    "a.cc": {
    "content": "#include <iostream>\nusing namespace std;\nint main() {\nint a, b;\ncin >> a >> b;\ncout << a + b << endl;\n}"
    }
    },
    "copyOut": ["stdout", "stderr"],
    "copyOutCached": ["a"]
    }]
    }

    响应

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    [
    {
    "status": "Accepted",
    "exitStatus": 0,
    "time": 303225231,
    "memory": 32243712,
    "runTime": 524177700,
    "files": {
    "stderr": "",
    "stdout": ""
    },
    "fileIds": {
    "a": "5LWIZAA45JHX4Y4Z" // 需要保存编译的二进制文件 id
    }
    }
    ]
  3. 运行请求:发送请求POST http://localhost:5050/run

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    {
    "cmd": [{
    "args": ["a"],
    "env": ["PATH=/usr/bin:/bin"],
    "files": [{
    "content": "1 1"
    }, {
    "name": "stdout",
    "max": 10240
    }, {
    "name": "stderr",
    "max": 10240
    }],
    "cpuLimit": 10000000000,
    "memoryLimit": 104857600,
    "procLimit": 50,
    "copyIn": {
    "a": {
    "fileId": "5LWIZAA45JHX4Y4Z" // 这个缓存文件的 ID 来自上一个请求返回的 fileIds
    }
    }
    }]
    }

    响应

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [
    {
    "status": "Accepted",
    "exitStatus": 0,
    "time": 1173000,
    "memory": 10637312,
    "runTime": 1100200,
    "files": {
    "stderr": "",
    "stdout": "2\n"
    }
    }
    ]

    运行完成后,请调用 DELETE /file/:id 删除编译的二进制文件,避免缓存泄漏

编译运行Java

  1. 安装运行环境

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // 1.从官网下载压缩包(x64 Compressed Archive)
    // https://www.oracle.com/cn/java/technologies/downloads/

    // 2.上传到容器中的文件夹(如/usr/local/jdk)
    // 3.解压
    tar -xvf xxx.tar.gz

    // 4.配置环境变量
    vim /etc/profile
    添加以下变量
    export JAVA_HOME=/usr/local/jdk/jdk-25
    export PATH=$JAVA_HOME/bin:$PATH

    // 5.测试是否安装成功
    java -version
  2. 运行请求:发送请求POST http://localhost:5050/run

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    {
    "cmd": [{
    "args": ["/usr/local/jdk/jdk-25/bin/java", "Main.java"],
    "env": [""],
    "files": [{
    "content": ""
    }, {
    "name": "stdout",
    "max": 10240
    }, {
    "name": "stderr",
    "max": 10240
    }],
    "cpuLimit": 10000000000,
    "memoryLimit": 104857600,
    "procLimit": 50,
    "copyIn": {
    "Main.java": {
    "content": "public class Main {\n public static void main(String[] args) {\n System.out.println(\"Hello, Java!\");\n }\n}"
    }
    }
    }]
    }

    响应

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [
    {
    "status": "Memory Limit Exceeded",
    "exitStatus": 0,
    "time": 1838655000,
    "memory": 104873984,
    "runTime": 1110982701,
    "procPeak": 20,
    "files": {
    "stderr": "",
    "stdout": "Hello, Java!\n"
    }
    }
    ]

go-judge
http://xwww12.github.io/2025/10/11/后端/go-judge/
作者
xw
发布于
2025年10月11日
许可协议