121 lines
4.7 KiB
Docker
121 lines
4.7 KiB
Docker
# 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
|
|
|
|
# Copie et installation des dépendances Python (mis en cache tant que requirements/ ne change pas)
|
|
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/inspections/ /app/inspections/
|
|
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/
|
|
|
|
# Métadonnées de build dynamiques (placées à la fin pour préserver le cache de build Docker)
|
|
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}
|
|
|
|
# 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"]
|