loko/Dockerfile

119 lines
4.5 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
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/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/
# 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"]