docker搭建复古中文 DOS 游戏,最多畅玩 2000 款!

前言
由于被委托找一个古老的游戏,寻找偶然知道有这么个项目chinese-dos-games,这是一个收集中国DOS游戏的项目,汇集了上千款游戏。它并且附带了一个试玩页,无需DOS环境,只要网页浏览器即可游玩,同时这也是开源的。

一番查找后发现曾经有人想要为其制作一个Docker版但并没有被合并进项目,现有的版本是由olddiy大佬于2018年制作,在此之后有一些更新没能体现在该Docker版本内。

所以本文简单介绍项目并且进行 docker build . 构建教学,自己维护一个新版本。

Chinese-DOS-Game
项目作者搭建的站点 https://dos.zczc.cz/,可以在上面玩到1K多款游戏(具体游戏列表点此),同时有js-box和em-dosbox两种引擎,配有虚拟键盘等等,相当全面的一个游戏界面了。

1_snapshot

如果你有什么私藏DOS游戏想要贡献,也可以到项目提交issue申请添加,帮助丰富游戏库。

搭建
本文的重点还是在docker镜像的构建,内容较为枯燥繁杂,甚至可能省略些简单步骤,想要尝试的看客请继续阅读

docker build
由于oldiy大佬的镜像没有继续更新,故这里自行构建一个镜像。该镜像在x86架构上测试通过,非x86的请自行尝试

新建一个文件,命名为 dos.Dockerfile ,添加以下内容:

FROM python:alpine3.16

LABEL MAINTAINER='blog.cfandora.com' \
DESCRIPTTION='Install chinese-dos-games-web by Docker'

WORKDIR /app/dos-games

RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories && \
apk update && apk add git && \
/usr/local/bin/python -m pip install --upgrade pip

RUN pip3 install flask && \
git clone https://github.com/rwv/chinese-dos-games-web.git /app/dos-games && \
git submodule update --init --recursive --remote && \
sed -i "23,20583d" ./static/games/games.json &&\
python3 ./static/games/download_data.py && \
sed -i 's/debug=True/host="0.0.0.0", port=5000, debug=True/g' ./app.py

VOLUME /app/dos-games/static/games

CMD [ "python3", "./app.py" ]
DOCKER
添加完毕后保存,运行以下开始构建docker。

docker build . -f ./dos.Dockerfile -t dosgame-web-docker:manual
BASH
2_1building

构建过程因网络因素(主要是与Github的连接性)可能比较缓慢,若卡在 clone into 或 Submodule path 'static/games': checked out 时建议使用代理

最后出现 Successfully built 时,即代表构建完成

2_2build

而后运行

docker run -d --name=dosgame -p 5000:5000 dosgame-web-docker:manual
BASH
返回一长串字符后即为运行成功,访问 http://宿主机IP:5000 ,若成功即可看到有一款游戏已经在等着你~

2_complete

游戏添加
考虑到体积问题,故仅预置了一款游戏,可以对比本镜像与oldiy的镜像体积差距将近400M,但同时游戏也少39款,所以我们需要自行下载补充(添加自己喜欢的游戏,这也是自行构建的目的之一)

3_compare

首先需要到此处查询想要下载的游戏相关信息,此处以 超级玛丽 为例,相关字段如下:

"超级玛丽": {
"identifier": "超级玛丽",
"name": {
"zh-Hans": "超级玛丽"
},
"executable": "mario.exe",
"type": "ACT",
"sha256": "59af4af2ffe17699c213cf41e13ab47276cdce3e534b7b9ef8a3e024e0cec38c",
"filesize": 64867,
"coverFilename": "cover.png"
}
JSON
由于Docker目录挂载原因,有两种添加游戏方式,各有优缺点,请自行选择

方法一:仅修改games.json

优点:仅需要控制一个文件

缺点:若游戏文件下载失败,维护时稍有门槛

新建路径作为镜像挂载目录,本文以/volume1/games为例 ,该目录下新建games.json并增加:

{
"games": {
"仙剑奇侠传": {
"identifier": "仙剑奇侠传",
"name": {
"zh-Hans": "仙剑奇侠传",
"zh-Hant": "仙劍奇俠傳",
"en": "The Legend of Sword and Fairy"
},
"releaseYear": 1995,
"executable": "PAL!.EXE",
"keymaps": {
"←→↑↓": "移动",
"Alt": "显示菜单、取消操作",
"Enter/Ctrl/Space": "对话、调查、菜单选择"
},
"links": {
"仙劍奇俠傳攻略": "https://chiuinan.github.io/game/game/intro/ch/c11/pal/"
},
"coverFilename": "cover.png",
"sha256": "ef209d15734a9e2e533d9a73f2550b3524be5c4cfd5b0ed68c82df6638784adb",
"filesize": 20272189
},
"超级玛丽": {
"identifier": "超级玛丽",
"name": {
"zh-Hans": "超级玛丽"
},
"executable": "mario.exe",
"type": "ACT",
"sha256": "59af4af2ffe17699c213cf41e13ab47276cdce3e534b7b9ef8a3e024e0cec38c",
"filesize": 64867,
"coverFilename": "cover.png"
}
}
}
JSON
添加完毕后保存,运行命令:

docker stop dosgame && docker rm dosgame
docker run -d --name=dosgame -p 5000:5000 -v /volume1/games/games.json:/app/dos-games/static/games/games.json dosgame-web-docker:manual
docker exec -it dosgame python3 static/games/download_data.py
BASH
3_1down

若下载成功,访问 http://宿主机IP:5000 即可看到超级玛丽出现了

若无法游玩,请检查网络并重新运行如图命令下载命令,并使用命令检查文件是否存在

docker exec -it dosgame ls static/games/bin
BASH
方法二:挂载游戏路径

优点:可以通过ftp等图形界面操作

缺点:操作些许繁琐

新建路径作为镜像挂载目录,本文以 /volume1/games 为例 ,而后使用命令:

docker cp dosgame:/app/dos-games/static/games/ /volume1/games/
BASH
将docker内的相关文件复制出来,而后编辑/volume1/games路径下的games.json,添加 超级玛丽 相关内容:

{
"games": {
"仙剑奇侠传": {
"identifier": "仙剑奇侠传",
"name": {
"zh-Hans": "仙剑奇侠传",
"zh-Hant": "仙劍奇俠傳",
"en": "The Legend of Sword and Fairy"
},
"releaseYear": 1995,
"executable": "PAL!.EXE",
"keymaps": {
"←→↑↓": "移动",
"Alt": "显示菜单、取消操作",
"Enter/Ctrl/Space": "对话、调查、菜单选择"
},
"links": {
"仙劍奇俠傳攻略": "https://chiuinan.github.io/game/game/intro/ch/c11/pal/"
},
"coverFilename": "cover.png",
"sha256": "ef209d15734a9e2e533d9a73f2550b3524be5c4cfd5b0ed68c82df6638784adb",
"filesize": 20272189
},
"超级玛丽": {
"identifier": "超级玛丽",
"name": {
"zh-Hans": "超级玛丽"
},
"executable": "mario.exe",
"type": "ACT",
"sha256": "59af4af2ffe17699c213cf41e13ab47276cdce3e534b7b9ef8a3e024e0cec38c",
"filesize": 64867,
"coverFilename": "cover.png"
}
}
}
JSON
前往游戏列表搜索 超级玛丽 ,进入页面下载

3_2down

下载得到的文件放置于/volume1/games/bin目录下,运行命令重启

docker stop dosgame && docker rm dosgame
docker run -d --name=dosgame -p 5000:5000 -v /volume1/games/:/app/dos-games/static/games/ dosgame-web-docker:manual
BASH
若修改正确,访问 http://宿主机IP:5000 即可看到超级玛丽出现了

常见问题
Failed to download game data

4_fail

构建中下载游戏环节或添加游戏后手动下载时,由于网络环境导致没有下载成功

解决:手动下载游戏放入指定位置或重新运行下载命令。也有可能是浏览器问题,尝试更换浏览器

Error response from daemon: You cannot remove a running container

当前容器正在运行无法删除

解决:添加-f 强制停止并删除

docker rm -f 镜像名称
BASH
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line X column X (char 922)

未按照JSON语法规范修改games.json。

解决:选用带有语法提醒的编辑器或使用JSON在线检查修改。

THE END