From a87d049ef601f2f8f7cf2e6e51be1f9882bc867f Mon Sep 17 00:00:00 2001 From: Antoine Jacquin Date: Thu, 17 Sep 2026 07:46:14 +0200 Subject: [PATCH] =?UTF-8?q?B=C3=A2cher=20l'interface=20dans=20l'image=20co?= =?UTF-8?q?mpl=C3=A8te=20aussi,=20repli=20inscriptible?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Le Dockerfile principal (worker, --serve, local-2m) n'avait pas l'étape de bake : le repli de webapp.py tentait d'écrire webapp_assets/ dans le paquet installé (dist-packages, propriété de root) et faisait planter l'import de la webapp sous l'utilisateur lidar. - Même étape de bake que Dockerfile.webapp, avec cd /tmp pour cibler le paquet installé (sinon la copie source /app capte l'import via sys.path). - Le repli de webapp.py ne casse plus l'import si le dossier du paquet n'est pas inscriptible : réécriture dans un répertoire temporaire. --- Dockerfile | 8 ++++++++ lidar_pipeline/webapp.py | 16 +++++++++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index ca40e83..0861108 100644 --- a/Dockerfile +++ b/Dockerfile @@ -58,6 +58,14 @@ COPY setup.py . COPY lidar_pipeline/ ./lidar_pipeline/ RUN pip3 install --no-cache-dir . +# CSS/JS de l'interface (app.js/app.css + Leaflet) bâchés dans l'image : +# la webapp les sert depuis webapp_assets/ du paquet installé, plus depuis +# le volume (cf. Dockerfile.webapp). cd /tmp : sans lui, python3 -c met le +# répertoire courant (/app, copie source) sur sys.path et le bake atterrirait +# dans la copie au lieu du paquet installé (dist-packages) qu'utilise le +# conteneur au runtime. +RUN cd /tmp && python3 -c "import pathlib, lidar_pipeline.index as i; i._write_ui_assets(pathlib.Path(i.__file__).resolve().parent / 'webapp_assets')" + # Copy backward-compatible entry point COPY process_lidar.py /usr/local/bin/ RUN chmod +x /usr/local/bin/process_lidar.py diff --git a/lidar_pipeline/webapp.py b/lidar_pipeline/webapp.py index 634ba76..015e922 100644 --- a/lidar_pipeline/webapp.py +++ b/lidar_pipeline/webapp.py @@ -147,14 +147,20 @@ async def _log_client_ip(request: Request, call_next): return await call_next(request) # CSS/JS de l'interface : servis depuis l'IMAGE (bâchés au build, cf. -# Dockerfile.webapp), plus depuis le volume — le code de l'interface suit -# l'image, pas le cache de tuiles. En repli (dev, source non bâchée), on les -# régénère depuis les constantes de l'index pour que /assets soit actif même -# avant la première génération. +# Dockerfile / Dockerfile.webapp), plus depuis le volume — le code de +# l'interface suit l'image, pas le cache de tuiles. En repli (dev, source +# non bâchée), on les régénère depuis les constantes de l'index ; si le +# dossier du paquet n'est pas inscriptible (install système sans bake), +# repli dans un répertoire temporaire pour ne pas casser l'import. _assets_dir = Path(__file__).resolve().parent / "webapp_assets" if not (_assets_dir / "app.js").is_file(): from .index import _write_ui_assets - _write_ui_assets(_assets_dir) + try: + _write_ui_assets(_assets_dir) + except OSError: + import tempfile + _assets_dir = Path(tempfile.gettempdir()) / "lidar_webapp_assets" + _write_ui_assets(_assets_dir) # --- Cache à la demande : la visualisation peuple le cache local ------------- # Les images viennent de la machine de traitement par HTTP : une image absente