# Use an official Python runtime as a parent image, choosing one that includes Node.js # Check Docker Hub for suitable tags (e.g., python:3.9-slim-bullseye might need Node installed) # Or use a Node image and install Python. Let's try a Node base and add Python. FROM node:20-slim # Install Python, pip, and venv # 'apt-get update && apt-get install -y --no-install-recommends' is standard practice # 'rm -rf /var/lib/apt/lists/*' cleans up afterward to keep image size down # Install Python, pip, venv, and Puppeteer dependencies # See: https://pptr.dev/troubleshooting#running-puppeteer-on-debian RUN apt-get update && \ apt-get install -y --no-install-recommends \ python3 \ python3-pip \ python3-venv \ # Puppeteer dependencies: ca-certificates \ fonts-liberation \ libasound2 \ libatk-bridge2.0-0 \ libatk1.0-0 \ libcairo2 \ libcups2 \ libdbus-1-3 \ libexpat1 \ libfontconfig1 \ libgbm1 \ libgcc1 \ libglib2.0-0 \ libgtk-3-0 \ libnspr4 \ libnss3 \ libpango-1.0-0 \ libpangocairo-1.0-0 \ libstdc++6 \ libx11-6 \ libx11-xcb1 \ libxcb1 \ libxcomposite1 \ libxcursor1 \ libxdamage1 \ libxext6 \ libxfixes3 \ libxi6 \ libxrandr2 \ libxrender1 \ libxss1 \ libxtst6 \ lsb-release \ wget \ xdg-utils \ && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* # Set up a new user named "user" with user ID 1001 (required for Docker Spaces) RUN useradd -m -u 1001 user # Switch to the "user" user USER user # Set home to the user's home directory ENV HOME=/home/user \ PATH=/home/user/.npm-global/bin:/home/user/.local/bin:$PATH # Set the working directory to the user's home directory WORKDIR $HOME/app # Copy the requirements file first to leverage Docker cache # Copy with proper ownership COPY --chown=user requirements.txt $HOME/app/ # Create a virtual environment and install Python dependencies # This isolates Python packages within the container, similar to local setup RUN python3 -m venv $HOME/app/venv # Activate venv for the RUN command and install packages RUN $HOME/app/venv/bin/pip install --no-cache-dir -r $HOME/app/requirements.txt # Copy the rest of the application code into the container with proper ownership COPY --chown=user . $HOME/app # Install mermaid-cli locally in the project directory to avoid permission issues # This will be used via npx which comes with npm RUN npm init -y && \ npm install @mermaid-js/mermaid-cli # Make port 7860 available to the world outside this container (required for Hugging Face Spaces) EXPOSE 7860 # Define environment variables # IMPORTANT: Set a strong FLASK_SECRET_KEY when running the container! # Using a placeholder here for demonstration. ENV FLASK_APP=app.py ENV FLASK_RUN_HOST=0.0.0.0 ENV FLASK_RUN_PORT=7860 ENV FLASK_SECRET_KEY="replace_this_in_docker_run_with_a_real_secret" # Add venv's bin to the PATH for subsequent commands (like CMD) ENV PATH="$HOME/app/venv/bin:/home/user/.npm-global/bin:$PATH" # Override base image entrypoint so CMD executes directly ENTRYPOINT [] # Run the application using Gunicorn when the container launches # Use the full path to gunicorn within the virtual environment # Bind to 0.0.0.0 to accept connections from outside the container # Use port 7860 (required for Hugging Face Spaces) # The number of workers (e.g., --workers 3) can be adjusted based on server resources # Use JSON form with the absolute path to gunicorn in the venv to avoid PATH issues CMD ["gunicorn", "--workers", "3", "--bind", "0.0.0.0:7860", "--timeout", "60", "app:app"]