# Utilisation de l'image officielle Miniforge (basée sur Debian) FROM condaforge/miniforge3:26.3.2-3 # Éviter l'écriture de fichiers .pyc et forcer le buffering immédiat des logs ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 WORKDIR /app # Installation des paquets système requis pour le runtime (ex: OpenGL et GLib pour OpenCV/YOLO) RUN apt-get update && apt-get install -y --no-install-recommends \ gnupg \ ca-certificates \ curl \ && curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg \ && (. /etc/os-release && echo "deb http://apt.postgresql.org/pub/repos/apt ${VERSION_CODENAME}-pgdg main" > /etc/apt/sources.list.d/pgdg.list) \ && apt-get update && apt-get install -y --no-install-recommends \ libgl1 \ libglib2.0-0 \ fonts-dejavu \ fonts-liberation \ postgresql-client-18 \ rsync \ openssh-client \ && rm -rf /var/lib/apt/lists/* # Création de l'environnement conda avec les packages cartographiques et poppler # gdal, geos, proj et poppler sont installés depuis conda-forge RUN mamba create -n streetup-env -y -c conda-forge \ python=3.12 \ gdal \ geos \ proj \ poppler \ && mamba clean -afy # Activation par défaut de l'environnement Conda dans le conteneur ENV PATH=/opt/conda/envs/streetup-env/bin:$PATH ENV CONDA_DEFAULT_ENV=streetup-env # Configuration explicite des variables GIS pour GeoDjango ENV GDAL_LIBRARY_PATH=/opt/conda/envs/streetup-env/lib/libgdal.so ENV GEOS_LIBRARY_PATH=/opt/conda/envs/streetup-env/lib/libgeos_c.so ENV PROJ_DATA=/opt/conda/envs/streetup-env/share/proj # Argument de build pour activer l'installation des librairies IA (ultralytics, OpenCV...) # Passer INSTALL_AI_LIBS=true dans le docker-compose pour les inclure ARG INSTALL_AI_LIBS=false # Copie et installation des dépendances Python COPY requirements/ /app/requirements/ RUN pip install --no-cache-dir -r requirements/base.txt && \ if [ "$INSTALL_AI_LIBS" = "true" ]; then \ pip install --no-cache-dir -r requirements/ai.txt; \ fi # 1. Copie des répertoires volumineux et statiques (très bonne mise en cache) COPY streetup/road_detection/detection_models/ /app/road_detection/detection_models/ COPY streetup/scripts/ /app/scripts/ COPY streetup/common/ /app/common/ COPY streetup/home/ /app/home/ # 2. Copie des modules de l'application qui changent rarement COPY streetup/locale/ /app/locale/ COPY streetup/templates/ /app/templates/ COPY streetup/analytics/ /app/analytics/ COPY streetup/api/ /app/api/ COPY streetup/authorizations/ /app/authorizations/ COPY streetup/contracts/ /app/contracts/ COPY streetup/documents/ /app/documents/ COPY streetup/maps/ /app/maps/ COPY streetup/notifications/ /app/notifications/ COPY streetup/projects/ /app/projects/ COPY streetup/reporting/ /app/reporting/ COPY streetup/schools/ /app/schools/ COPY streetup/sign/ /app/sign/ COPY streetup/stock/ /app/stock/ # 3. Copie des modules actifs ou modifiés fréquemment COPY streetup/streetup/ /app/streetup/ COPY streetup/mobile/ /app/mobile/ COPY streetup/observations/ /app/observations/ COPY streetup/controls/ /app/controls/ COPY streetup/interventions/ /app/interventions/ COPY streetup/assets/ /app/assets/ # 4. Copie des fichiers de code de road_detection (sans réimporter les modèles de détection) COPY streetup/road_detection/__init__.py /app/road_detection/ COPY streetup/road_detection/admin.py /app/road_detection/ COPY streetup/road_detection/apps.py /app/road_detection/ COPY streetup/road_detection/detection.py /app/road_detection/ COPY streetup/road_detection/forms.py /app/road_detection/ COPY streetup/road_detection/models.py /app/road_detection/ COPY streetup/road_detection/urls.py /app/road_detection/ COPY streetup/road_detection/views.py /app/road_detection/ COPY streetup/road_detection/migrations/ /app/road_detection/migrations/ COPY streetup/road_detection/templates/ /app/road_detection/templates/ # 5. Copie des fichiers Python et de configuration restants à la racine COPY streetup/*.py /app/ COPY streetup/generated_passwords.txt* /app/ # Exposer le port par défaut EXPOSE 8000 # Entrypoint de production : Gunicorn avec workers/timeout configurables via variables d'environnement # GUNICORN_WORKERS (défaut: 4) et GUNICORN_TIMEOUT (défaut: 120) peuvent être surchargés dans le docker-compose # En développement, "command: python manage.py runserver..." dans docker-compose.yml court-circuite cet entrypoint COPY docker-entrypoint.sh /docker-entrypoint.sh RUN chmod +x /docker-entrypoint.sh CMD ["/docker-entrypoint.sh"]