# Docker Build Optimization Cette configuration utilise une approche en 2 images pour accélérer les builds backend de **15-25 minutes** à **30 secondes - 2 minutes**. ## Architecture ### Image 1 : Base (`audio-classifier-base`) Contient toutes les dépendances système et Python qui changent rarement : - Python 3.9 + apt packages (ffmpeg, libsndfile, etc.) - numpy, scipy, essentia-tensorflow - Toutes les dépendances de `requirements.txt` **Build** : ~15 minutes (1 fois par semaine ou quand `requirements.txt` change) ### Image 2 : App (`audio-classifier-backend`) Hérite de l'image de base et ajoute uniquement le code applicatif : - Code source (`src/`) - Fichiers de configuration (`alembic.ini`) - Modèles Essentia (`models/`) **Build** : ~30 secondes - 2 minutes (à chaque commit) ## Workflows CI/CD ### 1. Build de l'image de base (`.gitea/workflows/docker-base.yml`) Se déclenche automatiquement quand : - `backend/requirements.txt` est modifié - `backend/Dockerfile.base` est modifié - Déclenchement manuel via l'interface Gitea ```bash # Image produite : git.benoitsz.com/benoit/audio-classifier-base:latest git.benoitsz.com/benoit/audio-classifier-base:sha- ``` ### 2. Build de l'image app (`.gitea/workflows/docker.yml`) Se déclenche à chaque push sur `main` : - Utilise l'image de base comme FROM - Copie uniquement le code source - Build rapide (~30s-2min) ```bash # Image produite : git.benoitsz.com/benoit/audio-classifier-backend:dev git.benoitsz.com/benoit/audio-classifier-backend:dev- ``` ## Utilisation en local ### Build de l'image de base ```bash cd backend docker build -f Dockerfile.base -t audio-classifier-base:local . ``` ### Build de l'image app (utilise l'image de base) ```bash # Depuis la racine du projet docker build \ --build-arg BASE_IMAGE=audio-classifier-base:local \ -f backend/Dockerfile \ -t audio-classifier-backend:local \ . ``` ### Build direct (sans image de base) - pour tests Si tu veux tester un build complet sans dépendre de l'image de base : ```bash # Revenir temporairement au Dockerfile original git show HEAD~1:backend/Dockerfile > backend/Dockerfile.monolithic docker build -f backend/Dockerfile.monolithic -t audio-classifier-backend:monolithic . ``` ## Mise à jour des dépendances Quand tu modifies `requirements.txt` : 1. **Push les changements sur `main`** ```bash git add backend/requirements.txt git commit -m "Update dependencies" git push ``` 2. **Le workflow `docker-base.yml` se déclenche automatiquement** - Build de la nouvelle image de base (~15 min) - Push vers `git.benoitsz.com/benoit/audio-classifier-base:latest` 3. **Les prochains builds backend utiliseront la nouvelle base** - Builds futurs rapides (~30s-2min) ## Déclenchement manuel Pour rebuild l'image de base manuellement (sans modifier `requirements.txt`) : 1. Va sur Gitea : `https://git.benoitsz.com/benoit/audio-classifier/actions` 2. Sélectionne le workflow "Build Base Docker Image" 3. Clique sur "Run workflow" ## Monitoring Vérifie les builds dans Gitea Actions : - **Base image** : `.gitea/workflows/docker-base.yml` - **App image** : `.gitea/workflows/docker.yml` Les logs montrent la durée de build pour chaque étape. ## Gains de performance attendus | Scénario | Avant | Après | Gain | |----------|-------|-------|------| | Build normal (code change) | 15-25 min | 30s-2min | **90-95%** | | Build après update deps | 15-25 min | 15-25 min (base) + 30s-2min (app) | 0% (1ère fois) | | Builds suivants | 15-25 min | 30s-2min | **90-95%** | ## Troubleshooting ### Erreur "base image not found" L'image de base n'existe pas encore dans le registry. Solutions : 1. Trigger le workflow `docker-base.yml` manuellement 2. Ou build localement et push : ```bash docker build -f backend/Dockerfile.base -t git.benoitsz.com/benoit/audio-classifier-base:latest backend/ docker push git.benoitsz.com/benoit/audio-classifier-base:latest ``` ### Build app lent malgré l'image de base Vérifie que le build-arg `BASE_IMAGE` est bien passé : ```yaml build-args: | BASE_IMAGE=${{ env.REGISTRY }}/${{ gitea.repository_owner }}/audio-classifier-base:latest ``` ### Dépendances Python pas à jour dans l'app L'image de base doit être rebuildée. Trigger `docker-base.yml`.