我们的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的另一个问题。
不幸的是,inotify 不能 在NFS上工作。 inotify通过在内核中的VFS(虚拟文件系统)层中挂钩来工作。每当修改发生时,inotify都会知道它,因为修改发生在同一台机器上,因此在同一个内核中 - 这使整个事情成为可能。
使用NFS,服务器上会进行修改,并且客户端需要进行通知。但是,NFS在进行更改时不会通知客户端。否则,它不会扩展。 NFS的设计(和操作)使单个服务器上有数千个客户端。想象一下,如果你做了一个微小的改变,服务器必须把它推送给所有客户!
当然,您可以说“嘿,NFS协议中应该有一个订阅机制,以便客户端可以告诉服务器他们想知道特定位置发生的更改”。好吧,NFS是30年前设计的,原谅他们不包括这个订阅/通知系统:-)
我不熟悉Assetic,但也许您可以使用自定义脚本手动监视更改,并在每次检测到更改时重新编译资产。只需遍历包含资源源的目录,跟踪关联数组中每个文件的mtime,每次检测到新文件(或新的mtime)时,重新编译。繁荣!
也可以看看 关于inotify和NFS的另一个问题。
这是一个旨在解决此问题的插件: https://github.com/mhallin/vagrant-notify-forwarder
只需安装它并重新加载您的盒子即可将inotify通知转发给您的客人机器:
vagrant plugin install vagrant-notify-forwarder