# Image de base Node.js FROM node:20-slim # socat = petit relais TCP qui fera le pont 0.0.0.0 -> 127.0.0.1 # (installation en root, pendant le build) RUN apt-get update \ && apt-get install -y --no-install-recommends socat \ && rm -rf /var/lib/apt/lists/* # Installation globale de 9router RUN npm install -g 9router@0.4.63 # --- Spécificité HuggingFace Spaces --- # UID 1000 = utilisateur "node" déjà présent dans l'image. USER node ENV HOME=/home/node \ PATH=/home/node/.local/bin:$PATH WORKDIR $HOME/app # Port exposé = port attendu par HuggingFace EXPOSE 7860 # Architecture : # - 9router tourne EN ARRIERE-PLAN sur 127.0.0.1:8080 (port interne) # - socat reste AU PREMIER PLAN (PID 1) : il écoute sur 0.0.0.0:7860 # et relaie tout vers 127.0.0.1:8080 # => le conteneur reste vivant (socat) ET le health check externe de # HuggingFace atteint bien le port 7860. CMD 9router --host 127.0.0.1 --port 8080 --no-browser --skip-update --log & \ sleep 5 && \ exec socat TCP-LISTEN:7860,fork,reuseaddr TCP:127.0.0.1:8080