2014-12-09 5 views
9

Warum, weil es schwierig ist, Code über Legacy-Editoren im Gast zu bearbeiten und zu bearbeiten. Der ganze Zweck von Vagrant ist, für den Entwickler leichter zu sein, richtig :)?Vagrant: Wie man den Ordner vom Gast zurück zum Wirt synchronisiert?

Als solche ich bitte mich jemand in dieser Situation zu führen:

  • Need an einem Projekt zu arbeiten. Es ist Git Repo. Benötigt mysql, php, etc, etc.
  • VM funktioniert super (mitgeliefert)
  • Aber Editieren von Dateien in diesem Repo nicht so einfach über SSH und "Legacy" -Editoren. Willst du Lieblings-IDE verwenden?

Auf der VM Repo ist in /home/vagrant/src. Ich möchte es in ../src im Host sichtbar/editierbar sein.

las ich die Dokumentation und geputtet dies im Vagranfile:

config.vm.synced_folder '../src', '/home/vagrant/src'

Diese „Werke“, außer dass sie alle Inhalte von /home/vagrant/src mit denen aus ../src die leer ist überschreibt.

Problemumgehung? Ich dachte über die Möglichkeit nach, den Repo via Git zu klonen (öffentlich verfügbar über github) und den Ordner mit der VM zu synchronisieren, aber das fühlt sich nicht richtig an und verliert auch die Produktionskonfiguration.

+0

haben Sie jemals eine Lösung finden? –

+0

Was ist Ihre Version von Virtualbox und Vagrant? –

+0

@JohnBachir Das 'home/vagrant/src' wird nicht überschrieben, aber das ursprüngliche wird ausgeblendet und ersetzt, wenn der Host-Ordner auf der VM eingehängt ist, da gibt es nicht viel zu tun. Warum können Sie das Repo auf dem Host nicht klonen und den Ordner auf der VM nicht synchronisieren? Ist das so, weil die Kompilierung viel zu viele Dateien erzeugt und die Synchronisation langsam wird (wie Composer in PHP?)? –

Antwort

4

Meine Vagrantfile sieht wie folgt aus:

Vagrant.configure(2) do |config| 
    config.vm.box = "bento/ubuntu-16.04" 
    config.vm.network "forwarded_port", guest: 80, host: 8080 
    config.vm.network :forwarded_port, guest: 22, host: 10170, id: "ssh" 
    config.vm.provision :shell, path: "VagrantProvision.sh" 
    config.vm.synced_folder "./", "/var/beeGame" 
end 

Wie man hier sehen kann ich die gleiche Aussage wie bei Ihnen! Here my repo (Sie können es wie Beispiel versuchen), und es funktioniert für mich!Ich benutze PhpStorm, um diesen Repo zu öffnen und Dateien und alle Updates automatisch zu bearbeiten und von meinem Host-Rechner (meinem Laptop) zum Gastrechner (virtuell) zu synchronisieren.

In Ihrem Fall, tun Sie alles in Ordnung, und Vagabund hat alle Inhalte von /home/vagrant/src mit denen aus ../src zu überschreibt. Es ist richtiges Verhalten !!! Sie müssen Ihren Code in src Verzeichnis auf Ihrem Host-Computer (Ihrem Laptop) nicht auf Ihrem Gastcomputer (virtuell)!

4

Scheint so, als ob Sie nach einer Zwei-Wege-Synchronisierung suchen. Wenn mein Verständnis richtig ist, hilft Ihnen das answer. Bitte beachten Sie, dass ich diese noch nicht getestet habe. Scheint, als wäre der Schlüssel virtualbox sync type zu verwenden.

type (string) - Der Typ des synchronisierten Ordners. Wenn dies nicht angegeben wird, wählt Vagrant automatisch die beste synchronisierte Ordneroption für Ihre Umgebung. Andernfalls können Sie einen bestimmten Typ wie "nfs" angeben.

config.vm.synced_folder '../src', '/home/vagrant/src', type: "virtualbox" 

Dann wieder nach this doc,

Wenn Sie die Vagrant VirtualBox-Provider verwenden, dann VirtualBox freigegebenen Ordner der Standard synchronisierten Ordner-Typ sind. Diese synchronisierten Ordner verwenden das VirtualBox-System für freigegebene Ordner, um Dateiänderungen vom Gast zum Host und umgekehrt zu synchronisieren.

Daher bin ich mir nicht sicher, warum Ihr Standardtyp nicht virtualbox ist. Jedenfalls ist das einen Versuch wert, denke ich. Weiter in der Dokumentation scheint ein Fehler im virtuellen Boxentyp zu sein, der in den Dokumenten erklärt wird. Bitte folgen Sie der steps here, wenn Sie den Sync-Typ der virtuellen Box verwenden möchten.

+1

2-way synching arbeitet mit 'config.vm.synced_folder" foo ","/bar "'. Ich habe Vagrant 1.9.2 und VirtualBox 5.1.22. Ich denke für das OP Zweiwege funktioniert auch. Aber das Problem ist, dass das Gästebuch leer ist, wenn die Config eingefügt wird (wie @ frédéric-henri Notizen, das ursprüngliche Verzeichnis wird nicht überschrieben, aber "versteckt" - ich weiß nicht genug über Dateisysteme oder andere Dinge zu tun weiß was das bedeutet). –

+0

2-Wege-Synchronisierung funktioniert nicht mit rsync nach diesem Problem aus dem Vagrant Git Repo https://github.com/hashicorp/vagrant/issues/3062 –

+0

'Typ:" virtualbox "' müssen VirtualBox Guest Additions installiert werden –

2

Ich habe festgestellt, dass das Problem nicht ist, dass config.vm.synced_folder '../src', '/home/vagrant/src' überschreibt/home/vagrant/src. Das Problem ist, dass home/vagrant/src zu einem neuen, anderen Typ von Verzeichnis im Dateisystem wird, das leer ist. Also muss man es einfach neu auffüllen, nachdem das freigegebene Verzeichnis eingerichtet wurde. So ...

  1. auf Gast: sudo mv home/vagrant/src home/vagrant/src-back
  2. halt Gast
  3. neu synchronisiert Ordner Vagrantfile hinzufügen: config.vm.synced_folder '../src', '/home/vagrant/src'
  4. Start Gast
  5. auf Gast: sudo mv home/vagrant/src-back/* home/vagrant/src-back/

Und Dinge sollte in Zukunft gut funktionieren.

1

I arbeiten mit vagrant mit dieser Struktur:

Vagrantfile 
MyCode.php 

und Vagrantfile enthält: ""

config.vm.synced_folder "/ vagabundierende"

, das bedeutet, dass MyCode.php ist sichtbar innerhalb der Vagrant Maschine in/Vagrant Ordner. Ich kann diese Datei sowohl von der vagabundierenden Maschine (dem Gast) als auch von meiner Maschine (dem Host) bearbeiten.

1

Sie können rsync mit Vagrant verwenden, es hat integrierte Unterstützung. Hier ist die link zur Dokumentation. Während es für rsync trivial ist, übermäßige Dateien am Ziel zu ignorieren (wahrscheinlich das Standardverhalten), können Sie immer noch genau synchronisieren, indem Sie Ihre Zieldateien mit protect filter schützen.

Im Gegensatz zur Montage muss rsync manuell ausgelöst werden. Sie können jedoch Vagrant rsync-auto Feature dokumentiert here für eine einfache Dateisystemüberwachung weiterhin verwenden.

1

Es klingt wie Sie einen Ordner von die Gastmaschine mit der Host-Maschine, die Art des Gegenteils teilen wollen, was die normalen freigegebenen Ordner tun.

Haben Sie darüber nachgedacht, NFS auf dem Gast bereitzustellen und dann vagrant-triggers zu verwenden, um die Freigabe vom Gast auf den Host zu mounten.

Erster Start von vagabundierenden-Trigger Installation:

vagrant plugin install vagrant-triggers

haben dann eine Vagrantfile wie folgt aus:

# where you want to mount the guest's shared folder on the host 
host_mount_dir = "/home/david/vagrant-home" 

Vagrant.configure(2) do |config| 
    config.vm.box = "debian/jessie64" 

    # forward the NFS port  
    config.vm.network "forwarded_port", guest: 2049, host: 8049 

    # configure NFS on guest 
    config.vm.provision "shell", inline: <<SCRIPT 
apt-get install -y nfs-kernel-server nfs-common 
host_ip="$(netstat -rn | grep "^0.0.0.0 " | cut -d " " -f10)" 
echo "/home/vagrant  $host_ip(rw,sync,no_subtree_check)" > /etc/exports 
exportfs -a 
SCRIPT 

    # after the machine is up, mount the NFS share 
    config.trigger.after :up do 
     # mkake the dir if it doesnt exist 
     run "mkdir -p " + host_mount_dir 
     # we need the users pass to mount (make sure you are a sudoer!)' 
     puts "Please enter your password so that we can run mount" 
     run "sudo mount -t nfs -o port=8049 localhost:/home/vagrant #{host_mount_dir}" 
    end 

    # before halting, unmount the share 
    config.trigger.before :halt do 
     # we need the users pass again 
     puts "Please enter your password so that we can run mount" 
     run "sudo umount #{host_mount_dir}" 
    end 

end 

Dies ist eine ungewöhnliche Einrichtung, aber ich getestet es jetzt mit einem Ubuntu-Host und ein Debian-Gast und es scheint zu funktionieren - YMMV.

0

verwendete ich den folgenden Hack den Ordner von Gast rsync Gastgeber:

  • Erstens, um die SSH-Konfiguration für die Box erhalten und speichern Sie sie auf ssh_config

$ vagrant ssh-config > ssh_config

  • Verwenden Sie dann rsync den Gastordner zurück zum Host mit der angegebenen Konfiguration

$ rsync -avH -e "ssh -F ./ssh_config" default:/vagrant/ ./

Es funktionierte für mich und ich hoffe, es funktioniert für Sie!

Grüße

-- 
    =^.^=