VBA-M on Docker

VisualBoyAdvance - MをDocker上で動かすDockerfile(とrunコマンドのオプションセット)を作った。 要X Window System、Pulseaudio。Ubuntu Desktop 18.04(with NVIDIA Driver)で動作確認。

Dockerfile

# for general machine
FROM ubuntu:bionic
# for nvidia-driver machine
# FROM nvidia/opengl:base-ubuntu18.04
ENV VERSION 2.1.4
ENV SHA1HASH bf6e452b53f47e2fbc4e6e41c92f567aa285cdbe
WORKDIR /vbam
RUN apt update \
&& apt -qq -y --no-install-recommends install \
ca-certificates \
tar \
wget \
# -- from builddeps script
build-essential \
g++ \
nasm \
cmake \
ccache \
gettext \
zlib1g-dev \
libgl1-mesa-dev \
libavcodec-dev \
libavformat-dev \
libswscale-dev \
libavutil-dev \
libswresample-dev \
libgettextpo-dev \
libpng-dev \
libsdl2-dev \
libsdl2-2.0 \
libglu1-mesa-dev \
libglu1-mesa \
libgles2-mesa-dev \
libsfml-dev \
libsfml-graphics2.4 \
libsfml-network2.4 \
libsfml-window2.4 \
libglew2.0 \
libopenal-dev \
libwxgtk3.0-dev \
libwxgtk3.0 \
libgtk2.0-dev \
libgtk-3-dev \
zip \
# sound driver to play sound on host
pulseaudio \
# build
&& mkdir /vbam-build && cd /vbam-build \
&& wget -O vbam.tar.gz https://github.com/visualboyadvance-m/visualboyadvance-m/archive/v${VERSION}.tar.gz \
&& echo "${SHA1HASH} vbam.tar.gz" | sha1sum -c - \
&& mkdir src \
&& tar xf vbam.tar.gz -C src --strip-components 1 \
&& mkdir build && cd build \
&& cmake ../src \
&& make \
# copy to /usr/local/bin/
&& mv visualboyadvance-m /usr/local/bin/ \
# remove build environment
&& rm -r /vbam-build/

ベースイメージは(とりあえず)基本はubuntu:bionicで、NVIDIAのGPUで動いてるマシンでビルドするときはnvidia/openglにする。これをやらないと描画時にlibGL error: No matching fbConfigs or visuals foundを吐く(逆にubuntu:bionicでの動作確認はしていないが.. 設定で描画をOpenGL以外にすればどちらでも動きそう)。

頭の環境変数を適切なものに変えてバージョンを切り替える。

ca-certificatesはwgetでGitHubからリリースを持ってくるときの証明書周りのエラー対策。tarwgetは持ってきて解凍する用。 build-essentialからzipまでは同梱されてる./builddeps(v2.1.4)を実行したときに呼び出されたコマンドから持ってきていて、 pulseaudioは音声再生用。

#buildから先がビルド用のコマンドで、makeの実行が終わった段階でvisualboyadvance-m(実行ファイル)が生成される。 これをPATHの通った/usr/local/binに移動して、(たぶん)いらないビルド環境を削除する。 ほんとはcmake、make、g++とかだけ入ったビルド用のイメージ上でビルドしたあと、実行ファイルだけ実行用のイメージにコピーしたほうがいいかもしれない。 依存関係が多くて(長くなって)面倒そうだったのでやってない。

docker run

xhost + local:root

ホスト上でローカルのrootユーザに対してX Serverのアクセス制限を解除。 これでDockerコンテナに共有する/tmp/.X11-unixを介してDockerコンテナ上のrootユーザがX Clientを実行できるようになる。 rootだったらいい気がするが、一応全部のアクセス制限を復活させるときはxhost -

sudo docker run -it --rm --name vbam \
-e DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
--gpus all \
--group-add $(getent group audio | cut -d: -f3) \
-e PULSE_SERVER=unix:${XDG_RUNTIME_DIR}/pulse/native \
-v ${XDG_RUNTIME_DIR}/pulse/native/:${XDG_RUNTIME_DIR}/pulse/native \
-v ${HOME}/.config/pulse/cookie:/root/.config/pulse/cookie \
-v ${PWD}/vbam:/vbam \
-v ${PWD}/vbam-conf:/root/.config/visualboyadvance-m \
vbam \
visualboyadvance-m

DISPLAY/tmp/.X11-unixはX Window用、 --gpus allは一応nvidia/openglをベースイメージにしたときのGPU指定を入れている。

group-addから${HOME}.config/pulse/cookieをマウントしてるところまでが音声再生用。ここは OpenSiv3D を Docker 上で動かす - nekketsu^ω を参考にした。ホスト上で鳴らしたサウンドと同じようにpavucontrolから見える。

ホストのvbamディレクトリをマウントしてVBA-Mからホスト側のファイルを参照できるようにする。 このディレクトリから読み込んで実行すれば.savファイルは同じディレクトリに保存されるのでホスト側に永続化される (vbamディレクトリ以下にセーブファイルディレクトリを設定すれば同じく永続化される)。

それから、vbam-confディレクトリをマウントしてコンフィグをホスト側に永続化するようにする。