Docker a annoncé le 25 octobre 2025 la disponibilité générale du watch mode dans Docker Compose 2.23, permettant le hot reload automatique des containers lors de modifications de code, le sync bidirectionnel des fichiers et un rebuild intelligent basé sur les changements. Fini les redémarrages manuels.
Watch Mode : Hot Reload Automatique
Problème du Workflow Traditionnel
Avant Docker Compose Watch :
# 1. Modifier code
vim src/api/users.js
# 2. Rebuild image
docker compose build api
# 3. Restart container
docker compose up -d api
# 4. Tester changement
curl localhost:3000/users
# Temps total : 45-90 secondes par changement
# × 50 changements/jour = 40-75 minutes perdues
Avec Docker Compose Watch (nouveau) :
# 1. Lancer en watch mode
docker compose watch
# 2. Modifier code
vim src/api/users.js
# → Container redémarre automatiquement (3 secondes)
# 3. Tester immédiatement
curl localhost:3000/users
# Temps : 3 secondes par changement
# × 50 changements/jour = 2,5 minutes
# Gain : 97% de temps économisé
Configuration Watch
docker-compose.yml avec watch :
version: '3.9'
services:
api:
build:
context: ./api
dockerfile: Dockerfile
ports:
- "3000:3000"
develop:
watch:
# Action 1: Sync files (pas de rebuild)
- action: sync
path: ./api/src
target: /app/src
ignore:
- node_modules/
# Action 2: Rebuild si Dockerfile change
- action: rebuild
path: ./api/Dockerfile
# Action 3: Rebuild si package.json change
- action: rebuild
path: ./api/package.json
frontend:
build:
context: ./frontend
dockerfile: Dockerfile
ports:
- "8080:80"
develop:
watch:
# Sync pour dev server avec HMR
- action: sync
path: ./frontend/src
target: /app/src
# Rebuild si dependencies changent
- action: rebuild
path: ./frontend/package.json
db:
image: postgres:15
volumes:
- pgdata:/var/lib/postgresql/data
# Pas de watch pour DB (stateful service)
volumes:
pgdata:
Actions disponibles :
- sync : Copy fichiers modifiés dans container (rapide, 100-500ms)
- rebuild : Rebuild image et restart container (lent, 15-45s)
- sync+restart : Sync + restart container sans rebuild (moyen, 2-5s)
Sync Bidirectionnel
File Watching Intelligent
Docker Watch détecte automatiquement :
// Modifié : api/src/routes/users.js
app.get('/users', async (req, res) => {
const users = await db.users.findAll();
res.json(users);
});
// → Docker détecte changement
// → Sync fichier dans container
// → Nodemon (dans container) détecte changement
// → Restart app automatiquement
// Total : 2-3 secondes
Performance monitoring :
Watch events (last 30s):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✓ api/src/routes/users.js → sync (280ms)
✓ api/src/models/user.js → sync (150ms)
✓ frontend/src/App.tsx → sync (320ms)
⚠ api/package.json → rebuild (28s)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Active containers: 3
Syncs: 245
Rebuilds: 2
Avg sync time: 285ms
Ignores Pattern
Optimiser performance avec .dockerignore-like :
develop:
watch:
- action: sync
path: ./api/src
target: /app/src
ignore:
# Performance : ignore heavy folders
- node_modules/
- dist/
- build/
- .git/
- '**/*.test.js' # Tests pas nécessaires en container
- '**/*.spec.js'
- coverage/
# Exclude temporary files
- '**/*~'
- '**/.DS_Store'
- '**/Thumbs.db'
Impact :
- Sync time : 850ms → 280ms (-67%)
- CPU usage : 45% → 12% (-73%)
Rebuild Intelligent
Dependency Detection
Rebuild uniquement si nécessaire :
# Backend Node.js
services:
api:
develop:
watch:
# Sync code changes (fast)
- action: sync
path: ./src
target: /app/src
# Rebuild si dependencies changent
- action: rebuild
path: package.json
- action: rebuild
path: package-lock.json
# Rebuild si Dockerfile change
- action: rebuild
path: Dockerfile
# Rebuild si .env change (variables env)
- action: rebuild
path: .env
Scénarios :
Scenario 1 : Modifier src/api.js
→ Action: sync (300ms)
→ Nodemon restart app in container (2s)
→ Total: 2,3s
Scenario 2 : Modifier package.json (nouvelle lib)
→ Action: rebuild (25s)
→ npm install in new image
→ Container restart with new dependencies
→ Total: 28s
Scenario 3 : Modifier Dockerfile
→ Action: rebuild (20s)
→ Full image rebuild
→ Container restart
→ Total: 22s
Multi-Service Orchestration
Microservices Stack
Exemple complet :
version: '3.9'
services:
gateway:
build: ./gateway
ports:
- "80:80"
depends_on:
- api
- auth
develop:
watch:
- action: sync
path: ./gateway/nginx.conf
target: /etc/nginx/nginx.conf
- action: sync+restart
path: ./gateway/conf.d
target: /etc/nginx/conf.d
api:
build: ./api
ports:
- "3000:3000"
depends_on:
- db
- redis
environment:
- NODE_ENV=development
develop:
watch:
- action: sync
path: ./api/src
target: /app/src
- action: rebuild
path: ./api/package*.json
auth:
build: ./auth
ports:
- "3001:3001"
depends_on:
- db
develop:
watch:
- action: sync
path: ./auth/src
target: /app/src
- action: rebuild
path: ./auth/requirements.txt
worker:
build: ./worker
depends_on:
- redis
- db
develop:
watch:
- action: sync
path: ./worker/tasks
target: /app/tasks
- action: rebuild
path: ./worker/Dockerfile
db:
image: postgres:15
volumes:
- pgdata:/var/lib/postgresql/data
# Pas de watch (stateful)
redis:
image: redis:7
# Pas de watch (cache)
volumes:
pgdata:
Lancement :
docker compose watch
# Output :
# ⠿ Starting watch for 4 services...
# ✓ gateway: watching nginx.conf, conf.d/
# ✓ api: watching src/, package.json
# ✓ auth: watching src/, requirements.txt
# ✓ worker: watching tasks/, Dockerfile
#
# Watching for changes...
Modifier plusieurs services simultanément :
# Terminal 1 : Watch mode actif
docker compose watch
# Terminal 2 : Edit multiple files
vim api/src/users.js # → api container sync (300ms)
vim auth/src/jwt.py # → auth container sync (250ms)
vim gateway/nginx.conf # → gateway reload (400ms)
# Tous les services updated en parallèle !
Cas d'Usage Concrets
Backend API Development
Setup typique Node.js/Express :
# docker-compose.yml
services:
api:
build:
context: .
dockerfile: Dockerfile.dev
volumes:
- .:/app
- /app/node_modules # Prevent overwrite
environment:
- NODE_ENV=development
develop:
watch:
- action: sync
path: ./src
target: /app/src
- action: sync
path: ./tests
target: /app/tests
- action: rebuild
path: package.json
# Dockerfile.dev
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci
# Install nodemon for hot reload
RUN npm install -g nodemon
COPY . .
# Dev command avec nodemon
CMD ["nodemon", "--watch", "src", "src/index.js"]
Workflow développeur :
# 1. Start watch
docker compose watch
# 2. Edit code
vim src/api.js
# → Sync instantané
# → Nodemon restart automatique (2s)
# 3. Test API
curl localhost:3000/api/health
# ✓ Changes live
# 4. Add new dependency
npm install axios
# → Rebuild automatique (25s)
# → axios disponible dans container
Frontend Development
React/Vite avec HMR :
services:
frontend:
build:
context: ./frontend
dockerfile: Dockerfile.dev
ports:
- "5173:5173" # Vite dev server
environment:
- CHOKIDAR_USEPOLLING=true # Fix file watching
develop:
watch:
- action: sync
path: ./frontend/src
target: /app/src
- action: sync
path: ./frontend/public
target: /app/public
- action: rebuild
path: ./frontend/package.json
Hot Module Replacement fonctionne :
// Edit src/App.tsx
export default function App() {
return <div>Hello World - Updated!</div>
}
// → Sync vers container (200ms)
// → Vite HMR update browser (500ms)
// → Browser refresh automatiquement
// Total : 700ms (instantané)
Database Migrations
Rebuild automatique lors de migration :
services:
api:
develop:
watch:
- action: sync
path: ./src
target: /app/src
# Rebuild si nouvelle migration
- action: rebuild
path: ./migrations
Workflow migration :
# 1. Créer migration
npm run migration:create add_users_table
# → Docker détecte nouveau fichier dans ./migrations
# → Rebuild container
# → Run migrations automatiquement (dans entrypoint)
# → Container ready avec nouvelle table
# Total : 30s automatiques vs 5 min manuels
Performance Optimisations
Polling vs Native Watching
Configuration optimale :
# Linux/macOS : native watching (inotify/fsevents)
develop:
watch:
- action: sync
path: ./src
target: /app/src
# Windows : polling recommandé (plus fiable)
# Ajouter dans container :
environment:
- CHOKIDAR_USEPOLLING=true
- CHOKIDAR_INTERVAL=1000 # Check every 1s
Performance :
| OS | Native watch | Polling | CPU usage |
|---|---|---|---|
| Linux | 150ms latency | 1000ms | 2% vs 8% |
| macOS | 200ms latency | 1000ms | 3% vs 9% |
| Windows | N/A (buggy) | 1000ms | - vs 12% |
Caching Layers
Multi-stage build pour speed :
# Dockerfile optimisé pour watch mode
FROM node:20-alpine AS base
WORKDIR /app
# Layer 1 : Dependencies (change rarement)
FROM base AS deps
COPY package*.json ./
RUN npm ci
# Layer 2 : Dev dependencies
FROM deps AS dev-deps
RUN npm install -g nodemon
# Layer 3 : Code (change souvent, sync uniquement)
FROM dev-deps AS dev
COPY . .
CMD ["nodemon", "src/index.js"]
Rebuild time :
- Full rebuild : 45s (première fois)
- Rebuild après changement package.json : 12s (cache layers 1-2)
- Sync code : 300ms (pas de rebuild)
Troubleshooting
Debug Watch Events
# Verbose logging
docker compose watch --verbose
# Output détaillé :
# 🔍 Watching api/src/index.js...
# 📝 File modified: api/src/index.js
# 🔄 Syncing to container api:/app/src/index.js
# ✓ Sync completed (285ms)
# 🔄 Container api restarting...
# ✓ Container api restarted (2.1s)
Common Issues
- Sync lent (plusieurs secondes) ** :
# Solution : Reduce watched files
develop:
watch:
- action: sync
path: ./src
target: /app/src
ignore:
- '**/*.test.js' # Exclude tests
- '**/node_modules'
- '**/.git'
- Rebuild loop infini ** :
# Problème : Fichier généré déclenche rebuild
# ❌ Mauvais
- action: rebuild
path: ./dist # dist/ généré par build → loop
# ✅ Bon
- action: rebuild
path: ./src # Uniquement source files
- File permissions sur Linux ** :
# Solution : Match user IDs
services:
api:
user: "${UID}:${GID}"
develop:
watch:
- action: sync
path: ./src
target: /app/src
# .env file
UID=1000
GID=1000
Adoption
Feedback developers (Week 1) :
"Watch mode = game changer, je gagne 1h/jour" — Backend dev, fintech
"Fini docker compose down/up 50x par jour" — Full-stack dev, startup
"Microservices dev devient aussi fluide que frontend HMR" — DevOps engineer, scale-up
Statistiques :
- 78000 developers adoptent watch mode (Week 1)
- Temps de développement moyen : -42%
- Frustration docker restart : -95%
Articles connexes
Pour approfondir le sujet, consultez également ces articles :
- Docker Desktop 5.0 : Extensions IA et Performance Révolutionnaire en 2025
- Kubernetes 1.29 : Sidecar Containers GA et JobSet pour ML
- AWS Graviton 4 : Les Processeurs ARM Révolutionnent le Cloud Computing en 2025
Conclusion
Docker Compose Watch Mode transforme le développement local de microservices en offrant un hot reload automatique comparable au frontend. Les sync rapides (300ms) et rebuilds intelligents éliminent les redémarrages manuels répétitifs.
Pour les développeurs :
- 97% temps économisé sur restarts
- Workflow fluide multi-services
- Configuration simple (5 lignes YAML)
Devriez-vous adopter ?
- ✅ Dev local microservices : Oui immédiatement
- ✅ Backend API avec hot reload : Oui
- ✅ Full-stack mono-repo : Oui
ROI :
- -40-50% temps de développement
- -95% frustration redémarrages
- +30% productivité équipe
Docker Compose Watch = must-have pour dev containers en 2025.



