前言

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

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

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

Chinese-DOS-Game

项目作者搭建的站点 https://dos.zczc.cz/,可以在上面玩到1K多款游戏(具体游戏列表点此),同时有js-boxem-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 build . -f ./dos.Dockerfile -t dosgame-web-docker:manual

2_1building

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

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

2_2build

而后运行

docker run -d --name=dosgame -p 5000:5000 dosgame-web-docker:manual

返回一长串字符后即为运行成功,访问 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"
    }

由于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

    3_1down

    若下载成功,访问 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"
        }
      }
    }

    前往游戏列表搜索 超级玛丽 ,进入页面下载

    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

    若修改正确,访问 http://宿主机IP:5000 即可看到超级玛丽出现了

常见问题

  • Failed to download game data

    4_fail

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

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

  • 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,可惜学艺不精暂时未能实现。

特别感谢

rwv/chinese-dos-games-web

oldiy/dosgame-web-docker基于olddiy的部署教程