# 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 loko-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/loko-env/bin:$PATH ENV CONDA_DEFAULT_ENV=loko-env # Configuration explicite des variables GIS pour GeoDjango ENV GDAL_LIBRARY_PATH=/opt/conda/envs/loko-env/lib/libgdal.so ENV GEOS_LIBRARY_PATH=/opt/conda/envs/loko-env/lib/libgeos_c.so ENV PROJ_DATA=/opt/conda/envs/loko-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 ARG GIT_COMMIT=unknown ARG BUILD_DATE=unknown ARG LOKO_VERSION=1.0.0 ENV GIT_COMMIT_SHA=${GIT_COMMIT} ENV BUILD_DATE=${BUILD_DATE} ENV LOKO_VERSION=${LOKO_VERSION} # 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 loko/scripts/ /app/scripts/ COPY loko/common/ /app/common/ COPY loko/home/ /app/home/ # 2. Copie des modules de l'application qui changent rarement COPY loko/locale/ /app/locale/ COPY loko/templates/ /app/templates/ COPY loko/analytics/ /app/analytics/ COPY loko/api/ /app/api/ COPY loko/authorizations/ /app/authorizations/ COPY loko/contracts/ /app/contracts/ COPY loko/documents/ /app/documents/ COPY loko/maps/ /app/maps/ COPY loko/notifications/ /app/notifications/ COPY loko/projects/ /app/projects/ COPY loko/reporting/ /app/reporting/ COPY loko/bim/ /app/bim/ COPY loko/sign/ /app/sign/ COPY loko/stock/ /app/stock/ # 3. Copie des modules actifs ou modifiés fréquemment COPY loko/loko/ /app/loko/ COPY loko/mobile/ /app/mobile/ COPY loko/observations/ /app/observations/ COPY loko/controls/ /app/controls/ COPY loko/interventions/ /app/interventions/ COPY loko/assets/ /app/assets/ COPY loko/panoramax/ /app/panoramax/ # 4. Copie des fichiers de code de road_detection (sans réimporter les modèles de détection) COPY loko/road_detection/__init__.py /app/road_detection/ COPY loko/road_detection/admin.py /app/road_detection/ COPY loko/road_detection/apps.py /app/road_detection/ COPY loko/road_detection/detection.py /app/road_detection/ COPY loko/road_detection/forms.py /app/road_detection/ COPY loko/road_detection/models.py /app/road_detection/ COPY loko/road_detection/urls.py /app/road_detection/ COPY loko/road_detection/views.py /app/road_detection/ COPY loko/road_detection/migrations/ /app/road_detection/migrations/ COPY loko/road_detection/templates/ /app/road_detection/templates/ # 5. Copie des fichiers Python et de configuration restants à la racine COPY loko/*.py /app/ COPY loko/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"]