在Docker VM中,Gulp-Watch似乎无法在主机操作系统托管的卷上运行良好

时间:2015-02-23 19:08:48

标签: node.js docker gulp boot2docker gulp-watch

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

问题是,如果我运行gulp,特别是gulp-watch,在docker中监视文件修改等,在docker容器中安装的应用程序代码上,在必要时正确构建并重新启动docker容器中的节点,它似乎得到cpu密集(如在轮询文件更改而不是监听文件更改事件)到我的机器扣的点。

我认为这是由于将文件系统从本机主机安装到docker容器的限制,但是人们如何解决这个问题呢?他们是否在容器中完成所有工作?本土主持人然后不断建设?或者我错过了gulp-watch / nodemon设置不正确的内容?

6 个答案:

答案 0 :(得分:6)

尝试更改gulp.watch options。这对我来说已经很多了:

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

答案 1 :(得分:6)

对于任何使用gulp4的人

我能让这个工作的唯一方法是使用" usePolling"如下所示

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

答案 2 :(得分:4)

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

答案 3 :(得分:1)

Jesse's answer对我不起作用,但它非常接近。现在,选项似乎是:

+----------+----------------------------+
|          |                            |
| Tree     |     +---+                  |
| Overview |     |   |   +--------+     |
|          |     |   |   |        |     |
|          |     |   |   +--------+     |
|          |     +---+                  |
|          |                            |
|          |   drag drop to resize      |
|          |   and position             |
|          +----------------------------+
|          |                            |
|          |   some options for leaf    |
|          |                            |
|          |                            |
+----------+----------------------------+

已为gulp.watch('./**/*', {interval: 1000, usePoll: true}, ['build']); 字段标记切换mode字段。

有关详细信息,请参阅the API section

答案 4 :(得分:0)

usePoll的先前答案:true无效。这个做了:

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

答案 5 :(得分:0)

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

假设某人想观看对./swagger/swagger.yaml中的swagger.yaml文件所做的更改,并将其转换为可与swagger UI一起使用的project.json文件。

假设安装了正确的节点模块,或者安装了独立的yaml到json转换工具,则可以运行以下命令:

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

其中:

  • ./editor/api/swagger/*是监视文件更改的目录
  • “节点./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, " "));