В виртуальной машине Docker Gulp-Watch, похоже, плохо работает на томах, размещенных в хост-ОС.

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

Проблема в том, что если я запускаю gulp и, в частности, gulp-watch, чтобы следить за модификациями файлов и т. д. в докере, в коде приложения, смонтированном в контейнере докера, для правильной сборки и перезапуска узла в контейнере докера по мере необходимости, кажется чтобы получить интенсивный процессор (например, при опросе изменений файлов вместо прослушивания событий изменения файлов) до такой степени, что моя машина сгибается.

Я думаю, это связано с ограничением монтирования файловой системы с собственного хоста в контейнер докеров, но как люди обходят это? Они делают всю свою работу в контейнере? Родной хост то постоянно строит? Или я что-то упускаю из-за неправильной настройки gulp-watch/nodemon?


person adrian    schedule 23.02.2015    source источник
comment
Кажется, это связано с этим, если у людей есть какой-либо вклад, github.com/paulmillr/chokidar/issues/ 212   -  person adrian    schedule 24.02.2015
comment
Более тесно связан с github.com/paulmillr/chokidar/issues/242, который был активно и приближается к решению на момент написания. Обходной путь: просто запустите gulp watch локально и позвольте вашему док-контейнеру обслуживать статические файлы. Если вы зависите от livereload, у вас, вероятно, будет такая же проблема, но подождите несколько недель/месяцев :)   -  person cameronboehmer    schedule 17.04.2015


Ответы (6)


Для тех, кто использует gulp4

Единственный способ заставить это работать - использовать usePolling, как показано ниже.

gulp.watch('./**/*', {interval: 1000, usePolling: true}, gulp.series('superTask'));
person el-davo    schedule 10.05.2016
comment
Как указано в документации (gulpjs.com/docs/en/api/watch) usePolling правильный вариант: needed for successfully watching files over a network or other non-standard situations - person Spears; 16.09.2019

Попробуйте изменить gulp.watch параметры. Это было намного лучше для меня:

gulp.watch('./**/*', {interval: 1000, mode: 'poll'}, ['build']);
person Jesse Fulton    schedule 25.06.2015

Вы должны использовать плагин gulp-watch вместо gulp.watch. Последний использует статистический опрос, который слишком тяжел для общей файловой системы. gulp-watch использует события inotify для просмотра файловой системы в OSX.

person mochtu    schedule 16.01.2017

Предыдущий ответ usePoll: true не сработал. Этот сделал:

gulp.watch('./**/*', {interval: 1000, usePolling: true}, ['build']);
person Robin Bank    schedule 02.07.2019

ответ Джесси мне не помог, но он был очень близок. Теперь вариант вроде такой:

gulp.watch('./**/*', {interval: 1000, usePoll: true}, ['build']);

Поле mode заменено флагом поля usePoll.

Дополнительные сведения см. в разделе API.

person user1985427    schedule 25.11.2015

В док-контейнере с установленным nodemon (npm i -g nodemon) есть альтернатива gulp watch.

Допустим, кто-то хочет просмотреть изменения в файле swagger.yaml в ./swagger/swagger.yaml и преобразовать его в файл project.json для использования с пользовательским интерфейсом swagger.

Предполагая, что установлены правильные модули узла или установлен автономный инструмент преобразования yaml в json, можно запустить следующее:

nodemon -L --watch ./editor/api/swagger/* --exec "node ./cvt_yaml_to_json.js"

куда:

  • ./editor/api/swagger/* — это каталог для отслеживания изменений файлов.
  • node ./cvt_yaml_to_json.js — команда для выполнения (это может быть произвольная команда). В данном случае это сценарий JavaScript, который зависит от модуля js-yaml (npm i js-yaml) и выполняет преобразование YAML в JSON следующим образом:
const yaml = require("js-yaml");
const path = require("path");
const fs = require("fs");

const swaggerYamlFile = "/api/project/editor/api/swagger/swagger.yaml";
const swaggerJsonFile = "/api/project/project.json";

//Converts yaml to json
const doc = yaml.safeLoad(fs.readFileSync(swaggerYamlFile));
fs.writeFileSync(swaggerJsonFile, JSON.stringify(doc, null, " "));

person Michael Czapski    schedule 25.06.2020