Docker Chokidar Hot Reload Fix
A one-line fix for the notorious hot reload problem in Docker containers when developing with Node.js tools (Vite, Webpack, Directus Extensions, etc.) on macOS and Windows.
The Problem
When you mount a local directory as a Docker volume:
volumes: - ./src:/app/srcFile watching doesn’t work on macOS and Windows because:
- Docker uses virtualized filesystems (VirtioFS, gRPC FUSE)
- Native
inotifyevents don’t propagate from host to container chokidar(used by Vite, Webpack, nodemon, etc.) never detects changes- Result: You change code, nothing reloads
This affects:
- Vite dev server
- Webpack dev server
- Directus Extensions
- Next.js dev mode
- Any Node.js app with hot reload
The Solution
Enable polling mode for chokidar:
CHOKIDAR_USEPOLLING=trueAdd to your .env or docker-compose.yml:
Option 1: .env file
CHOKIDAR_USEPOLLING=trueOption 2: docker-compose.yml
services: app: environment: - CHOKIDAR_USEPOLLING=trueOption 3: Dockerfile
ENV CHOKIDAR_USEPOLLING=trueWhy This Works
| Mode | How It Works | Performance | Docker Compatible |
|---|---|---|---|
inotify (default) | Kernel events | ⚡ Fast | ❌ No (on macOS/Win) |
polling | Periodic file checks | 🐢 Slower | ✅ Yes |
Polling mode checks file modification times at intervals instead of relying on kernel events that don’t work across Docker’s filesystem bridge.
Example: Directus Extensions
services: directus: image: directus/directus:latest volumes: - ./extensions:/directus/extensions environment: - CHOKIDAR_USEPOLLING=true - EXTENSIONS_AUTO_RELOAD=trueNow your TypeScript extensions hot reload properly!
Example: Vite in Docker
services: frontend: build: . volumes: - ./src:/app/src environment: - CHOKIDAR_USEPOLLING=true ports: - '5173:5173'Platform Notes
| Platform | Issue | Fix Required |
|---|---|---|
| macOS | VirtioFS doesn’t forward inotify | ✅ Yes |
| Windows (WSL2) | 9P filesystem limitations | ✅ Yes |
| Linux | Native inotify works | ❌ No |
Performance Tip
If polling feels slow, you can tune the interval:
CHOKIDAR_USEPOLLING=trueCHOKIDAR_INTERVAL=100 # milliseconds (default: 100)Lower = faster detection, higher CPU usage.
TL;DR
Problem: Hot reload doesn’t work in Docker on macOS/Windows
Cause: Native file events don’t cross Docker’s virtual filesystem
Fix: CHOKIDAR_USEPOLLING=true in environment