diff --git a/backend/Dockerfile b/backend/Dockerfile index 46c4c47..8b67b15 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -17,13 +17,19 @@ COPY pyproject.toml uv.lock ./ RUN uv sync --locked --no-dev -# --- Étape 2 : image d'exécution minimale, sans uv ni outils de build --- +# --- Étape 2 : image d'exécution minimale, sans installateur de paquets --- FROM python:3.13-slim ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ PATH="/opt/venv/bin:$PATH" +# Les dépendances sont déjà installées dans /opt/venv par l'étape de construction. +# Retirer pip et le bootstrap ensurepip supprime aussi leurs bibliothèques embarquées, +# inutiles à l'exécution et auditées par Trivy (msgpack, setuptools, urllib3, etc.). +RUN python -m pip uninstall --yes pip \ + && python -c "import ensurepip, pathlib, shutil; shutil.rmtree(pathlib.Path(ensurepip.__file__).parent)" + # Utilisateur sans privilèges : le processus ne tourne jamais en root. RUN useradd --uid 10001 --no-create-home --shell /usr/sbin/nologin app diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index ea85f38..6625782 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -196,6 +196,11 @@ Docker Compose fournit l'environnement de développement local. La préproductio reprennent les mêmes versions d'images avec leurs paramètres d'exploitation ; l'hébergement reste à arrêter. Le fichier Compose actuel n'est pas la configuration de production complète. +L'installation des paquets reste dans l'étape de construction du Dockerfile. L'image d'exécution +reçoit le virtualenv de production ; `pip`, ses bibliothèques embarquées et le bootstrap +`ensurepip` sont retirés de cette image. Toute évolution des dépendances passe par une +reconstruction et les audits CI, sans installation de paquets dans un conteneur en service. + | Mesure | Application | | --- | --- | | Images minimales, utilisateur non-root | Dockerfile du backend (vérifié par Trivy) |