Optimise ton Dockerfile : multi-stage, image légère, build rapide et déploiement facile pour ton app React Router 7. Passe à la pratique sans galère.
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é
Docker est la « machine virtuelle jetable » qui fera tourner ton app sur n’importe quel serveur. Sans optimisation, tu transportes :
/tests
, .env.example
, images...),node_modules
de ton OS.Résultat :
Dans cette leçon on transforme un Dockerfile naïf en image légère, reproductible et sûre, en s’appuyant sur les points clés montrés dans la vidéo précédente.
L’approche « multi-stage » te permet de :
react-router/dev
,
@types/*
, etc.) ;react
, @prisma/client
) ;1# Étape 1 : environnement de build2FROM node:22-alpine AS dev-deps3WORKDIR /app4COPY . .5RUN npm ci # installe deps & devDeps67# Étape 2 : uniquement les deps de prod8FROM node:22-alpine AS prod-deps9WORKDIR /app10COPY package*.json ./11RUN npm ci --omit=dev # 200 Mo de gagnés 💡1213# Étape 3 : build de l’app14FROM node:22-alpine AS build15WORKDIR /app16COPY --from=dev-deps /app .17RUN npm run build1819# Étape 4 : image finale ultra-slim20FROM node:22-alpine21WORKDIR /app22COPY package*.json ./23COPY --from=prod-deps /app/node_modules ./node_modules24COPY --from=build /app/build ./build25CMD ["npm","run","start"]
Étape | Contenu principal | Taille (≈) |
---|---|---|
dev-deps | repo complet + devDeps | 750 Mo |
prod-deps | node_modules minifiés | 220 Mo |
build | dossier /build (client + server JS) | 45 Mo |
finale | node:22-alpine + deps prod + build only | 160 Mo 🎉 |
Le reste est jeté lors du FROM
suivant.
Seule la dernière image est poussée sur Docker Hub ou exécutée sur ton VPS.
1.react-router2node_modules3build4*.log5tests
Si un chemin apparaît dans .dockerignore
, Docker ne l’ajoute à aucun moment,
donc même le premier stage gagne plusieurs secondes.
node:20-alpine
à node:22-alpine
simplement en modifiant la première ligne.
Tout le pipeline suit – zéro surprise.npm ci --omit=dev
--production
n’est plus nécessaire depuis npm 9.alpine
(libc musl) pour 80 Mo VS 180 Mo (slim
).package.json
; si seul ton code change,
l’étape npm ci
reste cachée.
1COPY package*.json ./2RUN npm ci --omit=dev3COPY . .
1docker build -t rr7:local .2docker run -d --name rr7 -p 3000:3000 rr7:local3open http://localhost:3000
Besoin d’explorer ?
Docker Desktop → rr7
→ Files : tu vérifies que seul /build
et
node_modules
sont présents.
Le job build actuel dans .github/workflows/docker-image.yml
ressemble à :
1- name: Build the Docker image2run: docker build . --file Dockerfile --tag my-image:${{ github.sha }}
Ajoute Login & Push vers Docker Hub :
1- uses: docker/login-action@v22with:3username: ${{ secrets.DOCKERHUB_USERNAME }}4password: ${{ secrets.DOCKERHUB_TOKEN }}56- uses: docker/build-push-action@v37with:8context: .9push: true10tags: "${{ secrets.DOCKERHUB_USERNAME }}/rr7:${{ github.sha }}"
Ainsi, la CI produit la même image que tu viens de tester en
local, prête à être docker pull
sur ton VPS (voir leçon
Configurer les Github Actions).
Symptom | Cause probable | Fix rapide |
---|---|---|
Cannot find module '@prisma/client' | DevDeps supprimées trop tôt | Garde @prisma/client en dependencies |
Timeout GitHub Actions (>6 min) | Cache Docker désactivé | actions/cache@v4 sur /home/runner/.npm |
Image > 500 Mo | Copie tout le repo | .dockerignore , multi-stage, npm ci --omit=dev |
NODE_ENV=production
(inutile depuis Node 20 mais
requis si tu actives certaines optimisations).distroless/node
pour grapiller encore 25 Mo (mais debugging plus
complexe).--platform=linux/amd64,linux/arm64
dans
docker/build-push-action
pour préparer l’image Apple Silicon.node_modules
prod + /build
..dockerignore
évite le gras involontaire.Tu as un doute, une erreur opaque ?
Viens sur le Discord Algomax : on débogue ton Dockerfile ensemble !
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 ?