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

时间:2014-01-17 16:13:20

标签: linux symfony vagrant assetic docker

我们的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一起工作?

3 个答案:

答案 0 :(得分:7)

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

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

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

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

另见this other SO question about inotify and NFS

答案 1 :(得分:4)

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

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

vagrant plugin install vagrant-notify-forwarder

答案 2 :(得分:0)

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

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