Node watch на томе docker-compose не регистрирует события удаления
У меня есть простой HTTP-сервер Node.js, работающий внутри контейнера Docker. Одна из основных структурных папок использует volume
от docker-compose.yml
отразить каталог хоста и контейнера.
На сервере Node у меня есть наблюдатель, настроенный для отслеживания изменений в объединенных каталогах с помощью пакета NPM chokidar
(хотя я уже пробовал несколько других наблюдателей с тем же результатом).
const watcher = require("chokidar");
watcher
.watch("./app/experiments", { depth: 0, ignoreInitial: true })
.on("all", (event, path) => {
console.log(event);
// ... DO SOME EXPRESS AND WEBPACK STUFF
});
Когда я запускаю Node-сервер локально, наблюдатель правильно регистрирует изменения в наблюдаемом каталоге. В этом случае, chokidar
сообщает об этом как addDir
или же unlinkDir
, которые соответствуют скрипту скаффолдинга, который я запускаю, чтобы добавить или удалить новые папки в каталог (который обслуживается позже через express.static()
)
STDOUT:
> addDir
> EXPERIMENT ADDED!
> ...
> unlinkDir
> EXPERIMENT DELETED!
Однако, когда я портирую приложение в докер-контейнер, поведение меняется очень странным образом. Я продолжаю получать addDir
события, когда я создаю новые папки в объединенных каталогах, но я больше не получаю unlinkDir
(удалить) события!, Обратите внимание, что это происходит только в том случае, если я добавляю / удаляю файл в каталоге пользователя на хост-компьютере. Если я добавляю / удаляю файл в этом каталоге внутри контейнера докера, мой наблюдатель правильно сообщает обо всех этих событиях.
В любом случае объемный каталог правильно отражает себя. Например, файлы на самом деле удаляются или добавляются, и я могу проверить их существование на хосте и зайти в контейнер докера и запустить ls
,
Какие-нибудь гении-докеры с мудрой мудростью объясняют, почему это происходит?
Основной материал:
OS X 10.13.6
Панель инструментов Docker:
- Докер 18.03.0-ц
- Docker-Maching 0.14.0
- docker-compose 1.20.1
- virtualbox 5.2.18r124319
Dockerfile:
FROM node:8.12.0
WORKDIR /usr/dd-labs
COPY package*.json ./
RUN npm install
COPY app/ ./app
COPY server.js ./
COPY webpack/ ./webpack
EXPOSE 8080
Docker-compose.yml:
version: "2"
services:
app:
image: #someImageName
build: .
ports:
- "8080:8080"
labels:
io.rancher.container.pull_image: always
environment:
VIRTUAL_HOST: labs.docker
volumes:
- ./app:/usr/dd-labs/app
command: [sh, -c, "npm run start:dev"]
1 ответ
Вероятно, вы используете Docker для Windows, в которой очень хорошо известно отсутствие поддержки распространения событий файловой системы от хоста к контейнерам.
Обходной путь - использовать опрос в среде разработчика. С chokidar вы хотите usePolling: true
вариант.