docker-compose.yml:
services:
db:
image: mysql:8.0
container_name: hustoj-db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: mysql_root_password # 修改为强密码
MYSQL_DATABASE: jol
MYSQL_USER: hustoj
MYSQL_PASSWORD: hustoj123 # 与 hustoj 服务保持一致
volumes:
# MySQL 数据持久化
- /home/hustoj/data/mysql:/var/lib/mysql
# 首次启动自动执行的初始化脚本
#- ./mysql-init:/docker-entrypoint-initdb.d:ro
networks:
- hustoj-net
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-uhustoj", "-phustoj123", "--silent"]
interval: 10s
timeout: 5s
retries: 10
start_period: 30s
# ----------------------------------------------------------
# HUSTOJ 主服务
# ----------------------------------------------------------
hustoj:
image: tangramor/hustoj
build:
context: .
dockerfile: Dockerfile
container_name: hustoj-app
restart: unless-stopped
depends_on:
db:
condition: service_healthy
environment:
# 数据库连接(与 db 服务保持一致)
DB_ROOT_PASS: mysql_root_password
DB_HOST: db
DB_PORT: "3306"
DB_NAME: jol
DB_USER: hustoj
DB_PASS: hustoj123 # 与 db 服务的 MYSQL_PASSWORD 保持一致
ports:
- "80:80" # OJ Web 界面,可改为 "8080:80" 避免冲突
volumes:
# --------------------------------------------------------
# 以下路径映射到宿主机,方便查看和修改
# --------------------------------------------------------
# 题目测试数据(最重要!一定要持久化)
- /home/hustoj/data/judge-data:/home/judge/data
# judge 配置文件(judge.conf 等)
- /home/hustoj/data/judge-etc:/home/hustoj/etc
# judge 运行日志
- /home/hustoj/data/judge-log:/home/judge/log
# Web 源码(如需直接修改 PHP 文件,取消注释)
- /home/hustoj/data/web:/home/hustoj/src/web
# 上传的文件(题目附件等)
- /home/hustoj/data/web-upload:/home/hustoj/src/web/upload
# nginx 日志
- /home/hustoj/data/nginx-log:/var/log/nginx
# hustoj 运行日志
- /home/hustoj/data/hustoj-log:/var/log/hustoj
networks:
- hustoj-net
networks:
hustoj-net:
driver: bridge
编辑 docker-compose.yml,将以下两处密码改为强密码,并保持一致:
# db 服务
MYSQL_ROOT_PASSWORD: mysql_root_password # ← 改这里
MYSQL_PASSWORD: hustoj123 # ← 改这里
# hustoj 服务
DB_ROOT_PASS: mysql_root_password # ← 与上面保持一致
DB_PASS: hustoj123 # ← 与上面保持一致
# 启动
docker compose up -d
# 查看启动日志
docker compose logs -f hustoj
启动完成后,访问:
http://localhost/
首次访问请注册用户名 admin,系统会自动为其赋予管理员权限。
| 宿主机路径 | 容器内路径 | 说明 |
|---|---|---|
/home/hustoj/data/mysql | /var/lib/mysql | MySQL 数据,必须持久化 |
/home/hustoj/data/judge-data | /home/judge/data | 题目测试数据,必须持久化 |
/home/hustoj/data/judge-etc | /home/hustoj/etc | judge.conf 等配置文件 |
/home/hustoj/data/judge-log | /home/judge/log | judge 运行日志 |
/home/hustoj/data/web-upload | /home/hustoj/src/web/upload | 题目附件上传目录 |
/home/hustoj/data/nginx-log | /var/log/nginx | nginx 日志 |
/home/hustoj/data/hustoj-log | /var/log/hustoj | hustoj 系统日志 |
如果需要直接修改 PHP 源码,取消 docker-compose.yml 中以下注释:
# - /home/hustoj/data/web:/home/hustoj/src/web
首次启动后,web 源码会自动同步到 /home/hustoj/data/web/。
# 启动服务
docker compose up -d
# 停止服务
docker compose down
# 查看日志
docker compose logs -f
# 进入 hustoj 容器
docker exec -it hustoj-app bash
# 进入 MySQL 容器
docker exec -it hustoj-db mysql -uhustoj -phustoj123 jol
# 重启 judged(在容器内)
docker exec hustoj-app pkill judged && docker exec hustoj-app judged &
| 端口 | 说明 |
|---|---|
80 | OJ Web 界面(可在 docker-compose.yml 中改为 8080:80) |
MySQL 端口不对外暴露,仅容器内部通信。如需访问 MySQL,可临时添加:
ports:
- "3306:3306"
将题目测试数据(data/ 目录格式)放入 /home/hustoj/data/judge-data/ 即可,
目录结构如下:
/home/hustoj/data/judge-data/
├── 1000/
│ ├── 1.in
│ └── 1.out
├── 1001/
│ ├── 1.in
│ └── 1.out
└── ...
Q: 容器启动后 Web 显示数据库连接失败?
A: 等待约 30 秒让 MySQL 完全就绪,hustoj 启动脚本会自动等待数据库就绪后再启动。
Q: 题目提交后一直 Pending?
A: 查看 judged 日志:docker compose logs hustoj | grep judged
Q: 如何备份数据?
A: 直接备份 /home/hustoj/data/ 目录即可,包含 MySQL 数据和题目数据。
Content type
Image
Digest
sha256:69f84e606…
Size
344.2 MB
Last updated
5 months ago
docker pull tangramor/hustoj