Docker Chokidar Hot Reload Fix
Однострочный фикс для печально известной проблемы hot reload в Docker контейнерах при разработке с Node.js инструментами (Vite, Webpack, Directus Extensions и др.) на macOS и Windows.
Проблема
Когда вы монтируете локальную директорию как Docker volume:
volumes: - ./src:/app/srcFile watching не работает на macOS и Windows потому что:
- Docker использует виртуализированные файловые системы (VirtioFS, gRPC FUSE)
- Нативные
inotifyсобытия не пробрасываются от хоста в контейнер chokidar(используется Vite, Webpack, nodemon и др.) никогда не детектит изменения- Результат: Вы меняете код, ничего не перезагружается
Затрагивает:
- Vite dev server
- Webpack dev server
- Directus Extensions
- Next.js dev mode
- Любое Node.js приложение с hot reload
Решение
Включить режим polling для chokidar:
CHOKIDAR_USEPOLLING=trueДобавить в ваш .env или docker-compose.yml:
Вариант 1: .env файл
CHOKIDAR_USEPOLLING=trueВариант 2: docker-compose.yml
services: app: environment: - CHOKIDAR_USEPOLLING=trueВариант 3: Dockerfile
ENV CHOKIDAR_USEPOLLING=trueПочему это работает
| Режим | Как работает | Производительность | Docker совместимость |
|---|---|---|---|
inotify (по умолчанию) | Kernel события | ⚡ Быстро | ❌ Нет (на macOS/Win) |
polling | Периодическая проверка файлов | 🐢 Медленнее | ✅ Да |
Polling режим проверяет время модификации файлов с интервалом вместо надежды на kernel события, которые не работают через filesystem bridge Docker.
Пример: Directus Extensions
services: directus: image: directus/directus:latest volumes: - ./extensions:/directus/extensions environment: - CHOKIDAR_USEPOLLING=true - EXTENSIONS_AUTO_RELOAD=trueТеперь ваши TypeScript extensions hot reload работают правильно!
Пример: Vite в Docker
services: frontend: build: . volumes: - ./src:/app/src environment: - CHOKIDAR_USEPOLLING=true ports: - '5173:5173'Заметки по платформам
| Платформа | Проблема | Фикс нужен |
|---|---|---|
| macOS | VirtioFS не пробрасывает inotify | ✅ Да |
| Windows (WSL2) | Ограничения 9P filesystem | ✅ Да |
| Linux | Нативный inotify работает | ❌ Нет |
Совет по производительности
Если polling кажется медленным, можно настроить интервал:
CHOKIDAR_USEPOLLING=trueCHOKIDAR_INTERVAL=100 # миллисекунды (по умолчанию: 100)Меньше = быстрее детекция, выше нагрузка CPU.
TL;DR
Проблема: Hot reload не работает в Docker на macOS/Windows
Причина: Нативные file события не проходят через virtual filesystem Docker
Фикс: CHOKIDAR_USEPOLLING=true в environment