Creer le fichier Dockerfile a la racine de votre dossier d'option (a cote de application/ ou des sources).
Squelette - option Pygame
FROM python:3.12-slim
LABEL borne="medias-pygame"
RUN apt-get update && apt-get install -y \
fonts-dejavu-core \
&& rm -rf /var/lib/apt/lists/*
RUN pip install --no-cache-dir pygame==2.5.2
WORKDIR /borne
COPY application/ /borne/
CMD ["python", "[fichier-quiz]"]
Squelette - option Qt
FROM python:3.12-slim
LABEL borne="medias-qt"
RUN apt-get update && apt-get install -y \
libxcb-xinerama0 libxcb-cursor0 libxcb-icccm4 libxcb-image0 \
libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-shape0 \
libxcb-sync1 libxcb-xfixes0 libxcb-xkb1 libxkbcommon-x11-0 \
libgl1 libegl1 libfontconfig1 libdbus-1-3 \
gstreamer1.0-plugins-good gstreamer1.0-plugins-base \
gstreamer1.0-pulseaudio \
fonts-dejavu-core \
&& rm -rf /var/lib/apt/lists/*
RUN pip install --no-cache-dir PySide6==6.7.2
WORKDIR /borne
COPY application/ /borne/
RUN python /borne/generer-sons.py /borne/sons
CMD ["python", "[fichier-encyclopedie]"]
Squelette - option three.js (Electron, app desktop)
On enveloppe le code three.js fourni dans Electron : meme bundle Vite, mais affiche dans une fenetre Chromium native au lieu d'etre servi par un serveur web. Deux approches possibles, dans les deux cas on ne modifie PAS le zip fourni : on travaille dans le dossier voisin ou cote Dockerfile.
Note de nommage importante. Le zip livre contient deja un src/main.js (c'est le code three.js du jeu). Pour eviter la confusion, on appelle le fichier d'entree Electron fenetre-electron.js et non main.js. Le main dans package.json pointe vers ce nouveau nom.
Approche A - Modifier le projet dans un dossier de travail (recommandee)
Vous copiez le contenu du zip dans un dossier de travail (par exemple borne-jeu3d/), puis vous y ajoutez les fichiers Electron. Le zip d'origine reste intact dans le sous-dossier option-threejs/. C'est l'approche la plus simple : tout est en clair, lisible, modifiable a la main.
Etape 1. Copier les fichiers du zip dans votre dossier de travail.
Terminal - preparer le dossier de travail
$ mkdir borne-jeu3d
$ cp -r option-threejs/* borne-jeu3d/
$ cd borne-jeu3d/
Etape 2. Ajouter fenetre-electron.js a la racine.
fenetre-electron.js (a creer a la racine du dossier de travail)
const { app, BrowserWindow } = require('electron')
app.whenReady().then(() => {
const fenetre = new BrowserWindow({
fullscreen: true,
webPreferences: { contextIsolation: true }
})
fenetre.loadFile('dist/index.html')
})
app.on('window-all-closed', () => app.quit())
Etape 3. Modifier package.json pour ajouter Electron et pointer sur fenetre-electron.js.
package.json (apres modification)
{
"name": "borne-jeu3d",
"version": "1.0.0",
"main": "fenetre-electron.js",
"scripts": {
"build": "vite build",
"start": "electron ."
},
"dependencies": { "three": "..." },
"devDependencies": {
"vite": "...",
"electron": "^31.0.0"
}
}
Etape 4. Le Dockerfile (a cote dans le dossier de travail) reste simple : il copie tout, fait npm install puis npm run build, et lance Electron.
Dockerfile - approche A (source deja prete)
FROM node:20
RUN apt-get update && apt-get install -y --no-install-recommends \
libgtk-3-0 libnss3 libasound2 libxss1 libxtst6 libdrm2 libgbm1 \
fonts-dejavu-core \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . ./
RUN npm run build
CMD ["npx", "electron", ".", "--no-sandbox"]
Approche B - Tout dans le Dockerfile, sans toucher au zip
Si vous voulez garder la source absolument intacte (par exemple parce que c'est un livrable verrouille), vous pouvez tout faire dans le Dockerfile : copier le zip tel quel, copier a cote un fenetre-electron.js que vous avez prepare, et patcher le package.json dans une couche RUN avec jq (ou sed). Plus complexe, mais le zip livre n'est jamais touche.
Structure du dossier de travail :
borne-jeu3d/
├── option-threejs/ (zip d'origine, intact)
│ ├── package.json
│ ├── src/
│ └── ...
├── fenetre-electron.js (votre entree Electron)
├── Dockerfile
├── .dockerignore
└── construire.sh / demarrer.sh / arreter.sh
Dockerfile - approche B (patche le package.json dans la build)
FROM node:20
RUN apt-get update && apt-get install -y --no-install-recommends \
libgtk-3-0 libnss3 libasound2 libxss1 libxtst6 libdrm2 libgbm1 \
fonts-dejavu-core jq \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY option-threejs/ ./
COPY fenetre-electron.js ./
RUN jq '.main = "fenetre-electron.js" | .devDependencies.electron = "^31.0.0"' \
package.json > package.json.tmp && mv package.json.tmp package.json
RUN npm install
RUN npm run build
CMD ["npx", "electron", ".", "--no-sandbox"]
Pourquoi jq. C'est l'outil standard pour modifier du JSON. Le filtre .main = "..." | .devDependencies.electron = "..." ajoute ou remplace ces deux cles sans toucher au reste du fichier. Plus robuste qu'un sed avec des expressions regulieres sur du JSON.
Comparaison rapide :
- A (recommandee) : code prepare a la main, Dockerfile court, debug facile. Le zip d'origine reste a cote, vous travaillez sur une copie. Bon choix pour ce labo d'initiation.
- B : zip jamais touche, tout est trace dans le Dockerfile. Plus complexe (jq, ordre des COPY important), mais reproductible a 100 % a partir du zip seul. Bon choix si vous devez livrer une demonstration "le zip d'origine plus mon Dockerfile suffisent".
Pour Pygame et Qt : ne lancez pas votre application avec un ENTRYPOINT en mode shell. Utilisez la forme exec (CMD ["python", "fichier.py"]). Sinon les signaux ne sont pas transmis et docker stop attend 10 secondes avant de tuer.
Pour Qt : si vous oubliez les libxcb-*, l'application demarre puis affiche qt.qpa.plugin: Could not load the Qt platform plugin "xcb" et plante. C'est l'erreur classique. Le Dockerfile fourni en exemple liste le minimum necessaire.
Pour three.js + Electron : si vous oubliez le .dockerignore, votre node_modules/ local est envoye au daemon a chaque build et peut peser plusieurs centaines de Mo. Voir etape 7.
Pour three.js + Electron : si la fenetre ne s'ouvre pas, c'est presque toujours X11. Verifiez que echo $DISPLAY n'est pas vide sur l'hote, et que vous avez bien fait xhost +local:docker avant le docker run. Le drapeau --no-sandbox dans le CMD est necessaire parce qu'Electron tourne en root dans le conteneur.
Le fichier Dockerfile existe, contient les bonnes instructions pour votre option, et la prochaine etape (le build) marche.