Fetch games into a volume at runtime instead of baking them into the image

927MB of the image was just t7g's two CD ISOs, which can't be meaningfully
compressed (already-compressed FMV/audio). Move the smbget/unzip step out
of the Dockerfile and into scripts/fetch_games.sh, run from server.sh on
container start: it populates GAMES_HOME on first run and skips the fetch
if games are already present. run.sh mounts a named volume so the games
survive --rm restarts instead of being re-downloaded every time. Image
drops from 1.6GB to ~690MB; first container start now needs network access
to the vlda-01 SMB share to seed the volume.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NiNnj78HGx1KWyCCo39HSz
This commit is contained in:
2026-07-28 08:25:26 +02:00
co-authored by Claude Sonnet 5
parent 79cc239dca
commit 44bbd00336
5 changed files with 38 additions and 16 deletions
+5 -11
View File
@@ -7,24 +7,18 @@ ENV GAMES_HOME=/opt/games
ENV SCRIPTS_HOME=/opt/scripts ENV SCRIPTS_HOME=/opt/scripts
ENV PATH=${PATH}:${SCRIPTS_HOME} ENV PATH=${PATH}:${SCRIPTS_HOME}
# unzip/smbclient are only needed to fetch and extract the games below, so they're # unzip/smbclient are needed at runtime now too: the games are no longer baked into the
# purged again in this same layer instead of being left in the final image. # image, fetch_games.sh pulls them into the ${GAMES_HOME} volume on first container start.
RUN apt-get update && \ RUN apt-get update && \
apt-get -y install --no-install-recommends dosbox alsa-utils unzip smbclient && \ apt-get -y install --no-install-recommends dosbox alsa-utils unzip smbclient && \
mkdir -p ${GAMES_HOME} /tmp/apps && \
cd /tmp/apps && \
smbget -au smb://vlda-01/software/Games/dosbox/stuntcar.zip && \
smbget -au smb://vlda-01/software/Games/dosbox/t7g.zip && \
unzip -o -d ${GAMES_HOME} "*.zip" && \
cd / && \
rm -rf /tmp/apps && \
apt-get -y purge unzip smbclient && \
apt-get -y autoremove && \
rm -rf /var/lib/apt/lists/* rm -rf /var/lib/apt/lists/*
RUN openssl req -x509 -nodes -newkey rsa:2048 -keyout /tmp/novnc.key -out /tmp/novnc.pem -days 3650 -subj "/C=US/ST=NY/L=NY/O=NY/OU=NY/CN=NY emailAddress=email@example.com" RUN openssl req -x509 -nodes -newkey rsa:2048 -keyout /tmp/novnc.key -out /tmp/novnc.pem -days 3650 -subj "/C=US/ST=NY/L=NY/O=NY/OU=NY/CN=NY emailAddress=email@example.com"
RUN touch /root/.Xauthority RUN touch /root/.Xauthority
RUN mkdir -p ${GAMES_HOME}
VOLUME ${GAMES_HOME}
ADD scripts ${SCRIPTS_HOME} ADD scripts ${SCRIPTS_HOME}
WORKDIR / WORKDIR /
+10 -4
View File
@@ -1,6 +1,12 @@
# TODO # TODO
- ~~Reduce image size of `jayfield/dosbox-novnc` (currently ~2.3GB).~~ Done: merged the - ~~Reduce image size of `jayfield/dosbox-novnc` (currently ~2.3GB).~~ Done in two steps:
game download/extract steps and the unzip/smbclient install into a single layer (so the 1. Merged the game download/extract steps and the unzip/smbclient install into a single
downloaded zips and the packages only needed to extract them no longer persist in the layer (so the downloaded zips and the packages only needed to extract them no longer
final image). 2.31GB -> 1.6GB. persist in the final image). 2.31GB -> 1.6GB.
2. Stopped baking the games into the image at all (927MB of that was just t7g's two CD
ISOs). `scripts/fetch_games.sh` now downloads them from the SMB share into
`${GAMES_HOME}` (`/opt/games`) on first container start instead, skipping the fetch if
already present. `run.sh` mounts a named volume (`dosbox-games`) so the games persist
across `--rm` restarts. 1.6GB -> ~690MB. Container now needs network access to
`vlda-01` at runtime (not just build time) for the first start.
+1 -1
View File
@@ -1,4 +1,4 @@
#/bin/bash #/bin/bash
docker run --name dosbox-novnc -d --rm --net bridge -e SCREEN_W=1536 -e SCREEN_H=960 --device /dev/snd jayfield/dosbox-novnc docker run --name dosbox-novnc -d --rm --net bridge -e SCREEN_W=1536 -e SCREEN_H=960 --device /dev/snd -v dosbox-games:/opt/games jayfield/dosbox-novnc
+20
View File
@@ -0,0 +1,20 @@
#!/usr/bin/env bash
set -e
SMB_BASE="smb://vlda-01/software/Games/dosbox"
GAME_ZIPS="stuntcar.zip t7g.zip"
if [ -n "$(ls -A "${GAMES_HOME}" 2>/dev/null)" ]; then
echo "Games already present in ${GAMES_HOME}, skipping fetch"
exit 0
fi
echo "Fetching games into ${GAMES_HOME}..."
TMPDIR=$(mktemp -d)
trap 'rm -rf "${TMPDIR}"' EXIT
cd "${TMPDIR}"
for zip in ${GAME_ZIPS}; do
smbget -au "${SMB_BASE}/${zip}"
done
unzip -o -d "${GAMES_HOME}" "*.zip"
+2
View File
@@ -4,6 +4,8 @@ set -x
RFB_PORT=59${DISPLAY_NUM} RFB_PORT=59${DISPLAY_NUM}
NOVNC_PORT=80${DISPLAY_NUM} NOVNC_PORT=80${DISPLAY_NUM}
${SCRIPTS_HOME}/fetch_games.sh
echo Display at ${DISPLAY} with ${SCREEN_W}x${SCREEN_H}x24 echo Display at ${DISPLAY} with ${SCREEN_W}x${SCREEN_H}x24
Xvnc ${DISPLAY} -geometry ${SCREEN_W}x${SCREEN_H} -depth 24 +xinerama -securitytypes none >/var/log/xvfb.log & Xvnc ${DISPLAY} -geometry ${SCREEN_W}x${SCREEN_H} -depth 24 +xinerama -securitytypes none >/var/log/xvfb.log &
fluxbox & fluxbox &