【问题标题】:Vagrant, shared folder: take advantage of inotify over NFSVagrant,共享文件夹:利用 inotify over NFS
【发布时间】:2014-02-07 01:26:26
【问题描述】:

我们的 Symfony2 webapp 在开发模式下使用 Assetic watcher 随时重新编译资产。

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

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

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

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

【问题讨论】:

    标签: linux symfony vagrant assetic docker


    【解决方案1】:

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

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

    vagrant plugin install vagrant-notify-forwarder
    

    【讨论】:

      【解决方案2】:

      您可能对这个名为 Guard 的工具感兴趣,它会侦听主机操作系统上所做的文件更改,然后在 Guest 上拉取并更新这些更改。这对我有用,现在我的资产几乎可以立即更新。

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

      【讨论】:

        【解决方案3】:

        很遗憾,inotify 不能在 NFS 上工作。 inotify 通过将自身挂接到内核中的 VFS(虚拟文件系统)层来工作。每当发生修改时,inotify 都会知道,因为修改发生在同一台机器上,因此发生在同一个内核中——这使得整个事情成为可能。

        使用 NFS,修改发生在服务器上,而通知预计会出现在客户端上。但是 NFS 不会在进行更改时通知客户端。否则,它不会扩展。 NFS 的设计(和操作)在单个服务器上拥有数千个客户端。想象一下,如果您做了一个微小的更改,服务器必须将其推送给所有客户端!

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

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

        另见this other SO question about inotify and NFS

        【讨论】:

        • 感谢您的详细解答。我们已经有了一个带有 Assetic 的轮询脚本,我在最初的问题中提到它是“观察者”,但它实际上非常慢(大约 1/2 分钟来检测变化)。
        猜你喜欢
        • 1970-01-01
        • 2016-03-21
        • 1970-01-01
        • 2017-07-18
        • 2016-09-08
        • 2017-08-20
        • 1970-01-01
        • 2016-03-28
        • 2016-05-11
        相关资源
        最近更新 更多