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 - /bin/sh: nodemon: 未找到
Nodemon 无法在 Docker 上使用 package.json 中的 npm 脚本