2014-01-17 13 views
11

Unsere Symfony2-Webanwendung verwendet den Ascendic Watcher im Entwicklungsmodus, um Assets unterwegs neu zu kompilieren.Vagrant, freigegebener Ordner: Nutzen Sie inotify über NFS

Die Webanwendung wird in einem Docker-Container ausgeführt, der in einer Vagrant-VM (Ubuntu 12.04 Precise) ausgeführt wird. Der Host ist OSX 10.9 Mavericks und teilt den Codeordner mit der VM über eine NFS (v3) Freigabe und der Code wird im Container über ein Host/Gast-Volume in Docker bereitgestellt.

Da inotify anscheinend keine Dateiänderungen über NFSv3 erkennen kann, arbeitet der Watcher im Polling-Modus, der sehr langsam sein kann (~ 1/2 Minuten, um die Änderung zu erkennen).

Ich habe gelesen, dass NFSv4 inotify kompatibel ist, aber ich habe keine gute Ressource dazu gefunden.

Gibt es eine Möglichkeit, NFS/Inotify zusammenzuarbeiten?

Antwort

7

Leider inotify kann nicht arbeiten auf NFS. inotify funktioniert, indem es sich im Kernel in die VFS-Ebene (virtuelles Dateisystem) einklinkt. Wann immer eine Modifikation passiert, weiß inotify davon, denn die Modifikation geschieht auf der gleichen Maschine, also im selben Kernel - was das Ganze möglich macht.

Mit NFS werden auf dem Server Änderungen vorgenommen, und auf dem Client werden Benachrichtigungen erwartet. Aber das NFS benachrichtigt die Clients nicht, wenn eine Änderung vorgenommen wird. Sonst würde es nicht skalieren. NFS wurde entwickelt (und betrieben), um Tausende von Clients auf einem einzigen Server zu haben. Stellen Sie sich vor, wenn Sie eine kleine Änderung vornehmen, und der Server muss es an alle Clients weitergeben!

Natürlich könnten Sie sagen "hey, es sollte einen Subskriptions-Mechanismus im NFS-Protokoll geben, damit Clients dem Server mitteilen können, dass sie über Änderungen an einem bestimmten Ort informiert werden möchten". Nun, NFS wurde vor 30 Jahren entwickelt, also vergib ihnen, dass sie dieses Abonnement/Benachrichtigungssystem nicht miteingeschlossen haben :-)

Ich bin nicht mit Assetic vertraut, aber vielleicht könntest du ein benutzerdefiniertes Skript haben, um manuell nach Änderungen zu suchen Kompilieren Sie die Assets jedes Mal neu, wenn Sie eine Änderung feststellen. Gehen Sie einfach durch das Verzeichnis, das die Quelle für die Assets enthält, verfolgen Sie die Zeit jeder Datei in einem assoziativen Array und kompilieren Sie jedes Mal, wenn Sie eine neue Datei (oder eine neue mtime) entdecken. Boom!

Siehe auch this other SO question about inotify and NFS.

+0

Vielen Dank für Ihre detaillierte Antwort. Wir haben bereits ein Polling-Skript mit Assetic, das ich als "Beobachter" in meiner ersten Frage erwähnt habe, aber es ist wirklich sehr langsam (~ 1/2 min, um Änderungen zu erkennen). –

3

Hier ist ein Plugin, das lösen Dies wollen: es installieren https://github.com/mhallin/vagrant-notify-forwarder

einfach und laden Sie Ihre Boxen inotify Benachrichtigungen an Ihre Gäste Maschine weitergeleitet haben:

vagrant plugin install vagrant-notify-forwarder 
Verwandte Themen