Vagrant, общая папка: используйте inotify над NFS

Наш Symfony2 webapp использует Ассистский наблюдатель в режиме разработки для повторной компиляции активов на ходу.

Webapp работает в контейнере Docker, который работает в Vagrant VM (Ubuntu 12.04 Precise). Хост - это OSX 10.9 Mavericks, и он разделяет папку кода с виртуальной машиной через общий ресурс NFS (v3), а код монтируется в контейнере через хост/гостевой том в Docker.

Поскольку inotify, похоже, не в состоянии обнаруживать модификации файлов над NFSv3, наблюдатель работает в режиме опроса, который может быть очень медленным (~ 1/2 минуты, чтобы обнаружить модификацию).

Я читал, что NFSv4 совместим с inotify, но я не нашел в нем никакого хорошего ресурса.

Есть ли способ совместной работы NFS/inotify?

Ответ 1

К сожалению, inotify не может работать с NFS. inotify работает, подключая себя в слое VFS (виртуальная файловая система) в ядре. Всякий раз, когда происходит модификация, inotify знает об этом, потому что модификация происходит на одной машине, поэтому в том же ядре, что делает все возможное.

С NFS на сервере происходят изменения, и уведомления ожидаются на клиенте. Но NFS не уведомляет клиентов о внесении изменений. В противном случае он не будет масштабироваться. NFS была разработана (и работает), чтобы иметь тысячи клиентов на одном сервере. Представьте, если вы сделаете небольшое изменение, и сервер должен нажать на всех клиентов!

Конечно, вы могли бы сказать: "Эй, должен быть механизм подписки в протоколе NFS, чтобы клиенты могли сообщать серверу, что они хотят знать об изменениях, происходящих в определенном месте". Ну, NFS был разработан 30 лет назад, поэтому простите их за то, что вы не включили эту систему подписки/уведомления: -)

Я не знаком с Assetic, но, возможно, у вас может быть пользовательский script, чтобы следить за изменениями вручную и повторно компилировать активы каждый раз, когда вы обнаруживаете изменения. Просто пройдите через каталог, содержащий источник для активов, отслеживайте mtime каждого файла в ассоциативном массиве и каждый раз, когда вы обнаруживаете новый файл (или новое mtime), перекомпилируйте. Boom!

См. также этот другой вопрос SO о inotify и NFS.

Ответ 2

Вот плагин, который пытается решить эту проблему: https://github.com/mhallin/vagrant-notify-forwarder

Просто установите его и перезагрузите свои коробки, чтобы иметь возможность уведомлять уведомления, направленные на ваш компьютер гостей:

vagrant plugin install vagrant-notify-forwarder

Ответ 3

Вам может быть интересен этот инструмент под названием Guard, который он прослушивает изменения файла, сделанные в операционной системе хоста, а затем на Guest он тянет и обновляет их. Это сработало для меня, и теперь мои активы обновляются почти мгновенно.

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

Ответ 4

Вы можете попробовать xnotify. Он был разработан, чтобы решить проблему, с которой вы столкнулись. https://github.com/AgentCosmic/xnotify