| # Usar una imagen base de Python basada en Debian estable (Bookworm es la versión actual) | |
| FROM python:3.10-slim-bookworm | |
| # Evitar que 'apt' solicite entradas interactivas durante la construcción | |
| ENV DEBIAN_FRONTEND=noninteractive | |
| # 1. Instalar dependencias del sistema (El "Paso GDAL" crítico) | |
| # - libgdal-dev: Proporciona los encabezados de C++ y la herramienta gdal-config | |
| # que 'pip' necesita para compilar los bindings de geopandas/fiona. | |
| # - build-essential: Compiladores C/C++ básicos. | |
| RUN apt-get update && \ | |
| apt-get install -y --no-install-recommends \ | |
| gdal-bin \ | |
| libgdal-dev \ | |
| build-essential \ | |
| && rm -rf /var/lib/apt/lists/* | |
| # 2. Configurar el entorno de la aplicación | |
| WORKDIR /app | |
| # Crear un usuario no-root por seguridad, una buena práctica en contenedores | |
| RUN useradd -m -u 1000 user | |
| USER user | |
| ENV HOME=/home/user \ | |
| PATH=/home/user/.local/bin:$PATH | |
| # 3. Instalar dependencias de Python | |
| # Copiar solo requirements.txt primero para aprovechar el caché de capas de Docker. | |
| # Si requirements.txt no cambia, Docker no volverá a ejecutar este paso. | |
| COPY --chown=user requirements.txt . | |
| # Instalar usando pip en el directorio del usuario, sin guardar caché para mantener la imagen ligera. | |
| RUN pip install --no-cache-dir --user -r requirements.txt | |
| # 4. Copiar el resto del código de la aplicación | |
| # El 'chown' asegura que el usuario 'user' sea el propietario de los archivos. | |
| COPY --chown=user . . | |
| # 5. Exponer el puerto que Hugging Face Spaces espera | |
| EXPOSE 7860 | |
| # 6. Comando para ejecutar la aplicación | |
| # Usar Gunicorn como un servidor WSGI de producción, no el servidor de desarrollo de Dash. | |
| # app_00:server -> Busca la variable 'server' en el archivo 'app_00.py'. | |
| # --bind 0.0.0.0:7860 -> Escucha en todas las interfaces de red en el puerto 7860. | |
| CMD ["gunicorn", "app_00:server", "--workers", "4", "--bind", "0.0.0.0:7860"] | |