Apprends à déployer React Router 7 avec Docker Compose : fichiers YAML, variables d’environnement, volumes et gestion multi-services. Passe la vitesse supérieure !
avec React Router 7
Posez vos questions 24/7 à notre IA experte en React Router 7
Validez vos acquis avec des quiz personnalisés et un feedback instantané
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 :
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é.
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
Dockerfile
..env
du dossier courant.docker-compose.yml
(ou .yaml
).-f
.1docker compose up --build -d
docker build
si l’image n’existe pas encore.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.
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
!
docker-compose.yml
.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.
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:
postgres
.depends_on
garantit 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.
Tu stockes des thumbnails générées à la volée ? Ajoute un volume dédié :
1volumes:2- ./image-cache:/app/image-cache
./image-cache
côté hôte/app/image-cache
côté conteneurMême après un docker compose down
, les fichiers restent sur ton disque.
Dans l’onglet Containers :
console.log
(très pratique pour les erreurs Prisma) ;/app
, vérifier la présence des fichiers, lancer node
.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)
docker run
en local : Compose fait tout mieux et plus vite.docker-compose.yml
(local), docker-compose.prod.yml
(VPS).
Lance le bon fichier avec docker compose -f docker-compose.prod.yml up -d
.--log-format json
dans react-router-serve
)
pour un parsing plus facile par Grafana ou Logtail.restart: on-failure
pour éviter les boucles infinies..env
sont injectées automatiquement.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 !
Quelle est la principale différence entre les composants client et serveur dans React ?
Quelle technique est recommandée pour éviter les rendus inutiles dans React ?
Quel hook permet de gérer les effets de bord dans un composant React ?
Comment implémenter la gestion des erreurs pour les requêtes API dans React ?
Quelle est la meilleure pratique pour déployer une application React en production ?