Node watch на томе docker-compose не регистрирует события удаления - PullRequest
0 голосов
/ 25 октября 2018

У меня есть простой 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.

Есть какие-нибудь гении-докеры с мудрой мудростью о том, почему это происходит?

KEY STUFF:

OS X 10.13.6

Docker Toolbox:

  • Docker 18.03.0-ce
  • 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 Ответ

0 голосов
/ 25 октября 2018

Вы, вероятно, используете Docker для Windows, у которого очень хорошо известно отсутствие поддержки для распространения событий файловой системы от хоста к контейнерам.

Обходной путь - использовать опрос всреда разработки.С chokidar вы хотели бы вариант usePolling: true.

...