Nodemon在Windows Docker环境中无法重启

37

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

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

在Linux和Mac环境中,nodemon和docker工作得非常顺畅。

然而,在Windows环境下,nodemon无法重新启动服务器。

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

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

有没有任何原因导致nodemon在Windows上无法重新启动服务器?

5个回答

80
使用 nodemon --legacy-watch 代替监听文件系统事件,以轮询文件更改。
VirtualBox 不会将文件系统事件传递到 vboxfs 共享 到您的 Linux VM。如果您使用 Docker for Windows,则似乎 HyperV 也不会传播文件系统事件。
作为2021年的附注,Docker for Mac/Windows 的新 GRPCfuse 文件系统用于将本地文件挂载到 VM 中现在应该可以发送文件系统事件了。
2022 年的说明:看起来 Windows/WSL Docker 不会将 FS 事件共享到 Linux VM(请参见 @Mohamed Mirghani 和 @Ryan Wheale 的评论以及 github 问题)。

2
非常感谢!我刚刚在Nodemon README中查看了这一部分。真的非常感谢你的出色响应时间。 - RyanNHG
您还可以指定轮询时间:只需将以下内容添加到nodemon.json配置文件中即可:"legacyWatch": true, "pollingInterval": 4000 - Sandokan El Cojo
2
对于新手和类似的人:在您的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运行此命令。 - Augie Gardner
2
非常感谢, 附注:现在是2022年,似乎Windows不会将文件系统事件发送到虚拟机。 - Mohamed Mirghani
1
同意@MohamedMirghani的观点-现在是2022年2月,我正在使用最新版本的Windows Docker(带有WSL后端),但Linux容器中挂载的Windows文件系统的更改并没有被容器内的文件监视器捕获到。 - Ryan Wheale
1
我的估计是这将在2025年得到修复。 - Rok Sprogar

13

根据文档,简单来说,你需要更改:

nodemon server.js

致:

nodemon --legacy-watch server.js

4
如其他人所述,使用node --legacy-watch可以解决问题,但是默认的轮询速率会对CPU造成很大负担。在我的情况下,仅通过循环遍历项目中的所有文件,就占用了30%的CPU。我建议你按照@Sandokan El Cojo提到的指定轮询间隔。
你可以通过将"pollingInterval": 4000(在此示例中为4秒)添加到nodemon.json文件中或使用命令中的-P--polling-interval标志来指定它。

1
默认值是100毫秒。我发现这太快了,会占用太多资源,所以1000毫秒应该完全可以接受。它的扩展性自然呈线性增长,我的CPU使用率在一个节点容器上从60%降至6%。https://github.com/remy/nodemon/blob/0823f18435e43639f3b6b9f296b7385e99cffa3b/doc/cli/options.txt#L25 - 1mike12

0

这不是一个稳定版本,而是一个边缘版本。 - Mukesh Agarwal
3
尽管已经到了2022年,但这个问题仍然存在。 - Mikhail Dudin

0

我在我的Docker环境中遇到了非常相似的问题,但问题是卷没有正确设置,请确保您真正正在编辑nodemon尝试观察的文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接