前言
由于被委托找一个古老的游戏,寻找偶然知道有这么个项目chinese-dos-games,这是一个收集中国DOS游戏的项目,汇集了上千款游戏。它并且附带了一个试玩页,无需DOS环境,只要网页浏览器即可游玩,同时这也是开源的。
一番查找后发现曾经有人想要为其制作一个Docker版但并没有被合并进项目,现有的版本是由olddiy大佬于2018年制作,在此之后有一些更新没能体现在该Docker版本内。
所以本文简单介绍项目并且进行 docker build .
构建教学,自己维护一个新版本。
Chinese-DOS-Game
项目作者搭建的站点 https://dos.zczc.cz/,可以在上面玩到1K多款游戏(具体游戏列表点此),同时有js-box
和em-dosbox
两种引擎,配有虚拟键盘等等,相当全面的一个游戏界面了。
如果你有什么私藏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 build . -f ./dos.Dockerfile -t dosgame-web-docker:manual
构建过程因网络因素(主要是与Github的连接性)可能比较缓慢,若卡在 clone into 或 Submodule path 'static/games': checked out 时建议使用代理
最后出现 Successfully built 时,即代表构建完成
而后运行
docker run -d --name=dosgame -p 5000:5000 dosgame-web-docker:manual
返回一长串字符后即为运行成功,访问 http://宿主机IP:5000
,若成功即可看到有一款游戏已经在等着你~
游戏添加
考虑到体积问题,故仅预置了一款游戏,可以对比本镜像与oldiy的镜像体积差距将近400M,但同时游戏也少39款,所以我们需要自行下载补充(添加自己喜欢的游戏,这也是自行构建的目的之一)
首先需要到此处查询想要下载的游戏相关信息,此处以 超级玛丽 为例,相关字段如下:
"超级玛丽": {
"identifier": "超级玛丽",
"name": {
"zh-Hans": "超级玛丽"
},
"executable": "mario.exe",
"type": "ACT",
"sha256": "59af4af2ffe17699c213cf41e13ab47276cdce3e534b7b9ef8a3e024e0cec38c",
"filesize": 64867,
"coverFilename": "cover.png"
}
由于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" } } }
添加完毕后保存,运行命令:
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
若下载成功,访问
http://宿主机IP:5000
即可看到超级玛丽出现了若无法游玩,请检查网络并重新运行如图命令下载命令,并使用命令检查文件是否存在
docker exec -it dosgame ls static/games/bin
方法二:挂载游戏路径
优点:可以通过ftp等图形界面操作
缺点:操作些许繁琐
新建路径作为镜像挂载目录,本文以
/volume1/games
为例 ,而后使用命令:docker cp dosgame:/app/dos-games/static/games/ /volume1/games/
将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" } } }
前往游戏列表搜索 超级玛丽 ,进入页面下载
下载得到的文件放置于
/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
若修改正确,访问
http://宿主机IP:5000
即可看到超级玛丽出现了
常见问题
Failed to download game data
构建中下载游戏环节或添加游戏后手动下载时,由于网络环境导致没有下载成功
解决:手动下载游戏放入指定位置或重新运行下载命令。也有可能是浏览器问题,尝试更换浏览器
Error response from daemon: You cannot remove a running container
当前容器正在运行无法删除
解决:添加
-f
强制停止并删除docker rm -f 镜像名称
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line X column X (char 922)
未按照JSON语法规范修改
games.json
。解决:选用带有语法提醒的编辑器或使用JSON在线检查修改。
遗憾
由于Github上web端代码并没有跟进作者搭建站点的代码,故许多新特性(例如js-box
)并不能够在自行搭建的服务中体现,略有些遗憾。
本次构建Docker的体积理论可以通过Multi-stage进一步缩小,估计是十几M,可惜学艺不精暂时未能实现。
特别感谢
oldiy/dosgame-web-docker 及 基于olddiy的部署教程
V · 2022-10-06 15:29
上家你好,人生何处不相逢啊!
竟然让我遇到了幼儿园的上家。
这个项目挺好玩的啊,不用自己折腾虚拟机和模拟器搞这些老游戏了,映射了端口应该也能外网吧?
Mitlearn 回复 V · 2022-10-07 10:58 作者
你认错了 我没有幼儿园
映射到外网可以通过外网访问
V 回复 Mitlearn · 2022-10-07 13:16
所以幼儿园的cfandora并不是你吗
Mitlearn 回复 V · 2022-10-08 22:53 作者
我是这里的驻站作者 cfandora是站长
V 回复 Mitlearn · 2022-10-09 13:20
pro mit 吗