Nodemon 在 Windows Docker 环境中不重启

Posted

技术标签:

【中文标题】Nodemon 在 Windows Docker 环境中不重启【英文标题】:Nodemon Doesn't Restart in Windows Docker Environment 【发布时间】:2017-01-07 11:00:06 【问题描述】:

我的目标是设置一个 Docker 容器,当从主机检测到文件更改时,它会自动重新启动 NodeJS 服务器。

我选择了 nodemon 来监视文件的变化。

在 Linux 和 Mac 环境中,nodemon 和 docker 运行良好。

但是,当我在 Windows 环境 中时,nodemon 不会重新启动服务器。

文件在主机上更新,并使用我的 docker-compose.yml 文件中的volumes 参数链接。

当我运行docker exec <container-name> cat /path/to/fileChanged.js 时,我可以看到文件已更改。这样我就知道文件被正确链接并在容器中被修改了。

nodemon 不重启 Windows 的服务器有什么原因吗?

【问题讨论】:

【参考方案1】:

使用nodemon --legacy-watch 轮询文件更改,而不是监听文件系统事件。

VirtualBox doesn't pass file system events over the vboxfs share 到您的 Linux 虚拟机。如果您使用 Docker for Windows,HyperV 似乎也不会传播文件系统事件。

作为 2021 年的附注,Docker for Mac/Windows 用于将本地文件挂载到 VM 的新 GRPCfuse 文件系统现在应该发送文件系统事件。

2022 注意:Windows/WSL Docker 似乎不向 Linux VM 共享 FS 事件(请参阅 cmets @Mohamed Mirghani 和 @Ryan Wheale)。

【讨论】:

非常感谢!我刚刚在Nodemon README 中查看了此部分。感谢您的出色响应时间。 您还可以指定轮询时间:只需将其添加到 nodemon.json 配置文件中:“legacyWatch”:true,“pollingInterval”:4000 对于新手等:来自 Dockerfile 的命令是:CMD ["nodemon", "-L", "your_file_here"]。或者类似地,你可以在你的 Dockerfile 中添加这样的内容:CMD ["npm", "run", "custom_script_name"],然后在 package.json 中放入 "scripts": "custom_script_name": "nodemon -L your_file_here", ... ,其中任何一个都将在 docker-compose up 之后从你的 Dockerfile 运行这个命令。 非常感谢,附注:现在是 2022 年,windows 似乎没有向 VM 发送文件系统事件 同意@MohamedMirghani - 现在是 2022 年 2 月,我在最新的 docker for Windows(带有 WSL 后端)上,并且来自安装在 Linux 容器中的 Windows 文件系统的更改没有被文件拾取容器中的观察者。【参考方案2】:

很简单,根据doc你必须改:

nodemon server.js

到:

nodemon --legacy-watch server.js

【讨论】:

【参考方案3】:

这是适用于 Windows 的 docker 中的一个问题。现在已经修复了

https://www.docker.com/blog/new-filesharing-implementation-in-docker-desktop-windows/

【讨论】:

它不是一个稳定的版本,它是一个优势 2022 年仍然存在这个问题【参考方案4】:

正如其他人所提到的,使用node --legacy-watch 会起作用,但是,默认的轮询率对你的 CPU 来说是相当沉重的。就我而言,仅通过循环遍历项目中的所有文件就消耗了我 30% 的 CPU。我建议您指定@Sandokan El Cojo 提到的轮询间隔。

您可以通过将"pollingInterval": 4000(在此示例中为 4 秒)添加到您的 nodemon.json 文件或在命令中使用 -P--polling-interval 标志指定它来实现。

【讨论】:

以上是关于Nodemon 在 Windows Docker 环境中不重启的主要内容,如果未能解决你的问题,请参考以下文章

docker中的Nodemon不起作用,--legacy-watch -L也不起作用

docker容器内的Nodemon

Docker - /bin/sh: nodemon: 未找到

Nodemon 无法在 Docker 上使用 package.json 中的 npm 脚本

Webstorm- Nodemon + Typescript + Docker - 调试器已连接但断点不起作用

Docker /bin/bash: nodemon: 找不到命令