Nodemon 在 Windows Docker 环境中无法重启

问题描述 投票:0回答:6

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

我选择了nodemon来监视文件的更改。

在 Linux 和 Mac 环境中,nodemon 和 docker 运行完美。

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

这些文件在主机上更新,并使用 docker-compose.yml 文件中的

volumes
参数进行链接。

当我运行

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

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

node.js windows docker watch nodemon
6个回答
77
投票

使用

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

VirtualBox 不会通过 vboxfs 共享将文件系统事件传递到您的 Linux VM。如果您使用的是 Windows 版 Docker,HyperV 也不会传播文件系统事件。

作为 2021 年的旁注,用于 Mac/Windows 的 Docker 新的 GRPCfuse 文件系统(用于将本地文件挂载到虚拟机中)现在应该发送文件系统事件。

2022 注意:看起来 Windows/WSL Docker 不会将 FS 事件共享到 Linux VM(请参阅评论 @Mohamed Mirghani 和 @Ryan Wheale 以及 github 问题)。


12
投票

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

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
标志来指定它。


0
投票

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

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


0
投票

我在 docker 环境中遇到了非常类似的问题,但问题是卷设置不正确,因此请始终检查您是否确实正在编辑 nodemon 试图监视的文件。


0
投票

在 package.json 中使用

nodemon --legacy-watch index.js
nodemon --legacy-watch server.js

© www.soinside.com 2019 - 2024. All rights reserved.