go-judge
go-judge
判题机
github仓库:https://github.com/criyle/go-judge
安装运行
docker hub:https://hub.docker.com/r/criyle/go-judge
在docker hub里找到
pull
命令下载镜像执行命令创建并运行容器
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:设置容器的 共享内存大小
测试:
localhost:5050/version
发送请求
编译运行C++
安装运行环境
1
2
3
4
5// 进入容器
docker exec -it go-judge /bin/bash
// 更新本地的软件包索引和安装 GNU C++ 编译器
apt update && apt install g++编译请求:发送请求
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
}
}
]运行请求:发送请求
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
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运行请求:发送请求
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/