Node.js 在Docker VM中,Gulp Watch似乎无法在主机操作系统托管的卷上正常工作

Node.js 在Docker VM中,Gulp Watch似乎无法在主机操作系统托管的卷上正常工作,node.js,docker,gulp,boot2docker,gulp-watch,Node.js,Docker,Gulp,Boot2docker,Gulp Watch,所以我有一个设置,可能和大多数人一样,他们的应用程序代码通过一个单独的卷装入Docker容器 问题是,如果我运行gulp,特别是gulp watch,在docker中,在docker容器中安装的应用程序代码上,监视文件修改等,以便在必要时正确构建并重新启动docker容器中的节点,它似乎会占用大量cpu(就像轮询文件更改而不是侦听文件更改事件)到我的机器崩溃的程度 我认为这是由于将文件系统从本机主机装载到docker容器的限制造成的,但是人们是如何解决这一问题的?他们是否在容器中完成所有工作?本

所以我有一个设置,可能和大多数人一样,他们的应用程序代码通过一个单独的卷装入Docker容器

问题是,如果我运行gulp,特别是gulp watch,在docker中,在docker容器中安装的应用程序代码上,监视文件修改等,以便在必要时正确构建并重新启动docker容器中的节点,它似乎会占用大量cpu(就像轮询文件更改而不是侦听文件更改事件)到我的机器崩溃的程度


我认为这是由于将文件系统从本机主机装载到docker容器的限制造成的,但是人们是如何解决这一问题的?他们是否在容器中完成所有工作?本机主机然后不断构建?或者我是否遗漏了一些使用gulp watch/nodemon设置不正确的内容?

尝试更改
大口喝一口。看一看
。这对我来说好多了:

gulp.watch('./**/*', {interval: 1000, mode: 'poll'}, ['build']);
对我来说不起作用,但很接近。现在,选择似乎是:

gulp.watch('./**/*', {interval: 1000, usePoll: true}, ['build']);
usePoll
字段标志的
模式
字段已关闭

有关更多详细信息,请参阅。

,了解使用gulp4的用户

我能让它工作的唯一方法就是像下面这样使用
usePolling

gulp.watch('./**/*', {interval: 1000, usePolling: true}, gulp.series('superTask'));

您应该使用插件
gulp-watch
而不是
gulp.watch
。后者使用stat-polling,这对于共享文件系统来说太重了。
gulp-watch
使用inotify事件在OSX上监视文件系统。

前面的
usePoll:true
的答案不起作用。这是:

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

在安装了nodemon(npm i-g nodemon)的docker容器中,有一种替代gulp watch的方法

假设您希望在./swagger/swagger.yaml中查看对swagger.yaml文件的更改,并将其转换为project.json文件以与swagger UI一起使用

假设安装了正确的节点模块,或者安装了独立的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的转换,如下所示:

这似乎与此相关,如果人们有任何与之更密切相关的输入,则在撰写本文时,该输入处于活动状态并接近解决方案。解决方法:只需在本地运行gulp watch,让docker容器提供静态文件。如果您依赖livereload,您可能会遇到相同的问题,但需要几周/几个月的时间:)如文档中所述()
usePolling
是正确的选项:
需要通过网络或其他非标准情况成功监视文件
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, " "));