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



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

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

我认为这是由于将文件系统从本机主机安装到docker容器的限制,但人们是如何解决这一问题的?他们所有的工作都在集装箱里吗?本地主机然后不断构建?或者我是不是错过了一些使用gullowwatch/nodmon设置不正确的东西?

对于任何使用gull4 的人

我能做到这一点的唯一方法是使用usePolling,就像下面的一样

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

尝试更改gulp.watch选项。这对我来说好多了

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

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

usePoll: true的上一个答案不起作用。这个做到了:

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

Jesse的回答对我不起作用,但非常接近。现在,选项似乎是:

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

mode字段已切换为usePoll字段标志。

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

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

假设有人想在中查看swagger.yaml文件的更改/swagger/swagger.yaml,并将其转换为project.json文件以用于swagger UI。

假设安装了正确的节点模块,或者安装了独立的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, " "));

最新更新