docker
fswatch
gaze
Chokidar
docker-compose

Dockerでfs.watchは動作しないので、代わりにgazeを使用しましょう。

したいこと

Nodeでファイルを監視しておき、変更があったらある処理を行う

fs.watchをラッパーしているchokidarを使用して監視する

  chokidar.watch('./src', {ignored: /(^|[\/\\])\../}).on('all', (event, path) => {
    handleChange();
  });

Dockerで動作させると・・・

% docker-compose up watch                                         (git)-[master]
Starting watch_1 ... done
Attaching to watch_1
watch_1 exited with code 0
%

Exitしてしまう。

解決策

Gulpでも使用されているgazeというモジュールを使うと解決します。
参考: https://stackoverflow.com/questions/42473561/nodejs-fs-watch-is-not-reacting-to-changes-inside-a-docker-container

gaze(['./src/**'], (err, watcher) => {
  if (err) throw err;
  watcher.on('all', (event, file) => {
    console.log(event, file);
    handleChange();
  });
});
% docker-compose up watch                                         (git)-[master]
Starting watch_1 ... done
Attaching to watch_1
watch_1   | changed /app/src/components/schemas/UserInfo.yml