FROM python:3.11-slim # System deps for GDAL/geopandas RUN apt-get update && apt-get install -y --no-install-recommends \ libgdal-dev \ gdal-bin \ libgeos-dev \ libproj-dev \ && rm -rf /var/lib/apt/lists/* WORKDIR /app # Install Python deps COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # Copy application files COPY data_pipeline.py . COPY dashboard_helpers.py . COPY app.ipynb . # Pre-download databases so it's baked into the image RUN python -c "import leafmap; \ leafmap.download_file( \ 'https://opengeos.org/data/duckdb/nyc_data.db.zip', \ unzip=True, \ overwrite=True \ )" RUN python data_pipeline.py # Expose the port HF Spaces expects EXPOSE 7860 # Force Jupyter to trust the notebook so widgets can execute JS RUN jupyter trust app.ipynb # Launch Voila with relaxed iframe security and gridstack template CMD ["voila", "app.ipynb", \ "--port=7860", \ "--no-browser", \ "--Voila.ip=0.0.0.0", \ "--Voila.tornado_settings={'headers':{'Content-Security-Policy':'frame-ancestors *'}}", \ "--template=gridstack"]