繁体   English   中英

Vagrant,共享文件夹:利用NFS上的inotify

[英]Vagrant, shared folder: take advantage of inotify over NFS

我们的Symfony2 webapp在开发模式下使用Assetic观察器来重新编译资产。

webapp在Docker容器中运行,该容器在Vagrant VM(Ubuntu 12.04 Precise)中运行。 主机是OSX 10.9 Mavericks,它通过NFS(v3)共享与VM共享代码文件夹,代码通过Docker中的主机/客户卷安装在容器中。

由于inotify似乎无法检测到NFSv3上的文件修改,因此观察者在轮询模式下工作,这种模式可能非常慢(检测到修改的时间约为1/2分钟)。

我已经读过NFSv4符合inotify,但我没有找到任何好的资源。

有没有办法让NFS / inotify一起工作?

不幸的是,inotify 无法在NFS上运行。 inotify通过在内核中的VFS(虚拟文件系统)层中挂钩来工作。 每当修改发生时,inotify都知道它,因为修改发生在同一台机器上,因此在同一个内核中 - 这使整个事情成为可能。

使用NFS,服务器上会进行修改,并且客户端需要进行通知。 但是,当进行更改时,NFS不会通知客户端。 否则,它不会扩展。 NFS的设计(和操作)使单个服务器上有数千个客户端。 想象一下,如果你做了一个微小的改变,服务器必须把它推送给所有客户!

当然,您可以说“嘿,NFS协议中应该有一个订阅机制,以便客户端可以告诉服务器他们想知道特定位置发生的更改”。 好吧,NFS是30年前设计的,原谅他们不包括这个订阅/通知系统:-)

我不熟悉Assetic,但也许您可以使用自定义脚本手动监视更改,并在每次检测到更改时重新编译资产。 只需遍历包含资源源的目录,跟踪关联数组中每个文件的mtime,每次检测到新文件(或新的mtime)时,重新编译。 繁荣!

另请参阅关于inotify和NFS的其他SO问题

这是一个旨在解决这个问题的插件: https//github.com/mhallin/vagrant-notify-forwarder

只需安装它并重新加载您的盒子即可将inotify通知转发给您的客人机器:

vagrant plugin install vagrant-notify-forwarder

您可能对这个名为Guard的工具感兴趣,它会监听在主机操作系统上进行的文件更改,然后在Guest上它会提取并更新这些文件。 这对我有用,现在我的资产几乎瞬间更新。

https://serverfault.com/questions/453826/vagrant-shared-folder-and-file-change-events

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM