Ce n'est un secret pour personne, j'ai toujours aimé les ordinateurs, et je gardes de merveilleux souvenirs de chacun d'eux (SpectraVideo, C64, PC286, Amiga, etc.). Je considère que je vis une époque formidable, car les machines d'aujourd'hui font fonctionner celles d'hier (et d'avant).
En surfant sur youtube, j'ai fini par découvrir qu'il était possible d'héberger une machine vintage dans un container, la vidéo est très didactique, mais prends quelques libertés avec l'optimisation.
Je ne veux pas d'une image ubuntu, j'ai une vrai préférence pour debian, et dans le build de la vidéo, il y a beaucoup de chose qui me dérange (un serveur web par exemple) ou qui sont liée à l'idée de faire tourner l'émulateur via un browser web (novnc, si tu m'entends :D).
Voici donc mon interprétation de cette idée…
J'ai commencé par consulter le build de base (disponible ici)
On va retirer tout ce qui relève de la partie web streaming du vnc (novnc, gstreamer1.0-tools, etc.) mais aussi des redondances (tightvncserver, mesa, etc.) alors qu'on va installer des packages spécifiques. En parlant de packages, la vidéo télécharge des packages directement sans utiliser les packages managers; ce qui me désole également.
Toutes mes images sont disponibles sur mon dockerhub.
Je vais donc exposer mon dockerfile
bloc par bloc pour y expliquer la logique.
les lignes sont numérotés par “bloc” pour pouvoir expliquer en détail ce qui s'y passe.
Image de base
Cette image est une customisation que j'ai faites, je publierais sans doute un article plus tard, tant cette customisation est avancée.
# # 86Box # FROM saintfrater/basic-debian:latest ARG LOCAL_USER=emulator # Create non root group & user RUN adduser $LOCAL_USER
Nous allons également executer l'application avec un utilisateur non-root.
Cet utilisateur est créer en ligne 8.
Paramétrage du serveur VNC
#User Settings for VNC ENV PASSWORD=password1
Ici l'on peut changer le mot de passe “par défaut” du container, il sera possible de changer 'en permanent' en utilisant un volume (voir plus bas).
Quelques variables d'ajustement
#Variables for installation ENV DEBIAN_FRONTEND=noninteractive ENV DEBCONF_NONINTERACTIVE_SEEN=true ENV XKB_DEFAULT_RULES=base
Téléchargement de l'AppImage
Une AppImage est sans doute le moyen le plus rapide d'installer une application qui n'existe pas en dépôt.
Dans l'image d'origine, cette AppImage était téléchargée dans le /
du container et ce n'est pas ce que je trouve propre, je propose donc de l'installer dans /opt/86box
, et d'y ajuster les configurations (ligne 2-3).
# Download & Setup 86Box RUN mkdir /opt/86box && \ cd /opt/86box && \ wget -nv https://github.com/86Box/86Box/releases/download/v4.1.1/86Box-Linux-x86_64-b5634.AppImage && \ mv 86Box-Linux-x86_64-b5634.AppImage 86Box.AppImage && \ chmod +x 86Box.AppImage && \ ./86Box.AppImage --appimage-extract > null && \ rm 86Box.AppImage
Nous téléchargeons une version particulière de l'AppImage (ligne 4); il serait intéressant d'automatiser la “lecture” de cette version, sans doute pour une prochaine release.
Cette AppImage est rendue exécutable (ligne 6) et exécutée pour forcer l'extraction dans le dossier, on peut ensuite effacer le AppImage (ligne 8) car il n'a plus d'utilité a conserver ce fichier.
Téléchargement des BIOS
Un PC ne peut démarrer sans BIOS, nous allons donc télécharger les BIOS depuis le github de 86box:
RUN apt-get install -y git # Download BIOSes into 'roms' ~133MB RUN cd /opt/86box/squashfs-root && \ git clone https://github.com/86Box/roms.git RUN apt-get purge -y git
Pour ce faire, nous avons besoin des outils git sur l'image (ligne 1); nous clonons ensuite les BIOS dans le répertoire /roms
de notre installation (ligne 3-4); nous finissons par purger de l'image les applications git.
Préparation des dossiers de configuration
# Create symlink for configuration RUN mkdir /opt/86box/customs && \ mkdir /opt/86box/media && \ chown -R $LOCAL_USER:$LOCAL_USER /opt/86box/customs && \ chown -R $LOCAL_USER:$LOCAL_USER /opt/86box/media && \ mkdir /var/log/86box && \ chown -R $LOCAL_USER:$LOCAL_USER /var/log/86box
Nous créons 2 dossiers customs et media qui seront ensuite publiés en dehors du container pour sauvegarder les données de façons permanentes.
Un dossier “/var/log/86box” est également créer pour recevoir les logs applicatifs.
supervisor et publication de port
#Copy in supervisor configuration for startup COPY supervisord.conf /etc/supervisor/supervisord.conf
nous copions une version personnalisée de supervisord.conf dans etc.
EXPOSE 5901
Nous exposons le port 5901 (VNC) du container.
configuration du mode 'local user'
Comme nous désirons que l'application ne s'execute pas en mode 'root'; nous continuons sous l'utilisateur définit par l'argument “LOCAL_USER”.
# setup session as "LOCAL_USER", not root USER $LOCAL_USER
Configuration VNC Server
Par défaut le password est password1, il pourra être changer par la suite.
# Configure VNCServer RUN mkdir ~/logs/ && \ mkdir ~/.vnc/ && \ echo $PASSWORD | /opt/TurboVNC/bin/vncpasswd -f > ~/.vnc/passwd && \ chmod 0600 ~/.vnc/passwd
configuration de ratpoison
RatPoison est sans doute l'une des découvertes les plus utile de ce tuto: c'est un gestionnaire de fenêtre très intéressant, il n'a pas besoin de souris pour fonctionner, et en plus, il offre des possibilités de scripting/ configuration et d'automation avancées.
# Configure application launch RUN echo "set border 0" > ~/.ratpoisonrc && \ echo "exec cd /opt/86box/squashfs-root && EMU86BOX_MOUSE=evdev ./AppRun">> ~/.ratpoisonrc
Nous réduisons à 0 la bordure des applications (ligne 2) afin de ne pas avoir de cadre a notre application, ensuite nous ordonnons a ratpoison d'executer l'émulateur.
Quelques volumes
# Create volumes mount # VOLUME /var/log/86box VOLUME /opt/86box/customs VOLUME /opt/86box/media
Supervisord
L'image d'origine utilise également supervisord pour lancer des taches “de fond”, comme le serveur VNC.
#Copy in supervisor configuration for startup ENTRYPOINT [ "supervisord", "-c", "/etc/supervisor/supervisord.conf" ]