Spaces:
Sleeping
Sleeping
| # 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"] | |