Configurer le fichier Docker Compose
Apprends à déployer React Router 7 avec Docker Compose : fichiers YAML, variables d’environnement, volumes et gestion multi-services. Passe la vitesse supérieure !
Pourquoi passer par Docker Compose ?
Ton Dockerfile compile déjà l’image de production (cf. leçon précédente).
Mais lancer l’image à la main avec docker build + docker run devient vite pénible :
- tu oublies une variable d’environnement → boom, crash ;
- impossible de redémarrer automatiquement le conteneur ;
- tu veux ajouter PostgreSQL ou Redis ? il faut tout refaire à la main.
Docker Compose te permet de décrire plusieurs conteneurs dans un seul fichier declaratif. Une seule commande ➜ Build, lancement, restart, logs, volumes, réseaux : tout est orchestré.
Créer le fichier docker-compose.yml
1services:2react_router:3build:4context: .5dockerfile: Dockerfile # même Dockerfile qu'en prod6container_name: react_router7ports:8- "3000:3000" # host:container9restart: always # relance après crash ou reboot10environment:11- DATABASE_URL12- SESSION_SECRET13- FRONTEND_URL
- services : un objet par conteneur.
- build.context : le dossier où se trouve ton
Dockerfile. - restart: always : le conteneur redémarre si ton VPS reboot.
- environment : Compose lit la valeur dans le
.envdu dossier courant.
Tip
docker-compose.yml (ou .yaml).Si tu veux en avoir plusieurs (dev / prod), tu pourras utiliser l’option
-f.Lancer l’environnement local
1docker compose up --build -d
- up : démarre tous les services.
- --build : force un
docker buildsi l’image n’existe pas encore. - -d : détache le terminal (le conteneur s’exécute en arrière-plan).
1docker compose ps
1NAME STATUS PORTS2react_router Up 30s 0.0.0.0:3000->3000/tcp
Navigue sur http://localhost:3000 ➜ l’app tourne comme en prod, mais sur ta machine.
Gérer les variables d’environnement
Tout ce qui est listé sous environment: est lue depuis .env.
1DATABASE_URL="postgresql://postgres@localhost:5432/react_router_7"2SESSION_SECRET="my_ultra_secret"3FRONTEND_URL="http://localhost:5173"
Si tu oublies une variable, Zod (mis en place dans la leçon
« Variables d’environnement typées »)
fera planter l’app dès le démarrage. Le conteneur redémarrera en boucle :
pense à bien compléter ton .env !
Warning
docker-compose.yml.Avec un dépôt public ? C’est la fuite assurée.
S’occuper du fameux prisma generate
Au premier lancement tu as peut-être vu :
1Error: Could not find schema.prisma
Le problème vient du Dockerfile : on ne copiait pas le dossier prisma/.
Voici le correctif :
1-COPY ./package.json package-lock.json /app/2+COPY ./package.json package-lock.json /app/3+COPY ./prisma /app/prisma
Puis regénérer le client :
1RUN npm ci --omit=dev2+RUN npx prisma generate # ^? client généré dans l'image
Redémarre Compose : plus d’erreur Prisma.
Ajouter PostgreSQL en un claquement de doigts
1--- docker-compose.yml2services:3db:4image: postgres:165restart: always6environment:7POSTGRES_PASSWORD: postgres8volumes:9- db_data:/var/lib/postgresql/data10react_router:11build:12context: .13ports:14- "3000:3000"15depends_on:16- db17volumes:18db_data:
- On importe l’image officielle
postgres. - volumes garde tes données persistantes même si tu rebuild l’image.
depends_ongarantit que Postgres sera prêt avant que React Router ne démarre.
Mets à jour DATABASE_URL :
1DATABASE_URL="postgresql://postgres:postgres@db:5432/postgres"
Note le host db : c’est le nom du service dans Compose,
résolu automatiquement par Docker via le réseau interne.
Gérer le cache ou les uploads : les volumes
Tu stockes des thumbnails générées à la volée ? Ajoute un volume dédié :
1volumes:2- ./image-cache:/app/image-cache
./image-cachecôté hôte/app/image-cachecôté conteneur
Même après un docker compose down, les fichiers restent sur ton disque.
Note
Inspecter et déboguer depuis Docker Desktop
Dans l’onglet Containers :
- clique sur react_router ;
- Logs affiche la sortie
console.log(très pratique pour les erreurs Prisma) ; - Exec ouvre un shell : tu peux parcourir
/app, vérifier la présence des fichiers, lancernode.
Commandes Compose à retenir
1docker compose up -d # build + start2docker compose logs -f # suivre les logs3docker compose restart # redémarrer tous les services4docker compose down # stop + remove containers5docker compose down -v # …et les volumes (⚠️ supprime tes données)
Important
docker run en local : Compose fait tout mieux et plus vite.Bonnes pratiques Algomax
- Un fichier compose = un contexte
docker-compose.yml(local),docker-compose.prod.yml(VPS). Lance le bon fichier avecdocker compose -f docker-compose.prod.yml up -d. - Volumise ce qui doit survivre (Bdd, uploads, cache).
- Loggue en JSON (option
--log-format jsondansreact-router-serve) pour un parsing plus facile par Grafana ou Logtail. - Restart Always : indispensable sur un VPS.
Sur ton Mac, tu peux préférer
restart: on-failurepour éviter les boucles infinies.
En résumé
- docker-compose.yml décrit ton application et, demain, toute ton stack.
- Une seule commande pour builder, lancer, relancer.
- Les variables
.envsont injectées automatiquement. - Ajouter Postgres ou Redis = trois lignes de YAML.
- Grâce aux volumes, tes données résistent aux rebuilds.
- Docker Desktop devient ton meilleur ami pour inspecter les logs et les fichiers internes.
La prochaine étape ? Brancher GitHub Actions pour builder l’image et pousser automatiquement sur Docker Hub — puis l’installer sur ton VPS. Rendez-vous dans la leçon suivante !
Comprendre les concepts fondamentaux
Quelle est la principale différence entre les composants client et serveur dans React ?
Optimisation des performances
Quelle technique est recommandée pour éviter les rendus inutiles dans React ?
Architecture des données
Quel hook permet de gérer les effets de bord dans un composant React ?