Vagrant: comment synchroniser un dossier de guest back à host?

pourquoi, parce qu'il est difficile de travailler et d'éditer du code via des éditeurs traditionnels dans l'invité. Le but de vagrant est d'être plus facile pour le développeur, non:)?

en tant que tel je plaise à quelqu'un pour me guider dans cette situation:

  • Besoin de travailler sur un projet. Il est repo git. Nécessite mysql, php, etc,etc.
  • VM fonctionne très bien ()
  • mais éditer des fichiers dans ce rapport n'est pas si facile via les éditeurs SSH et "legacy". Souhaitez utiliser IDE favori.

Sur la VM repo est dans /home/vagrant/src. Je veux qu'il soit visible et modifiable dans ../src dans l'hôte.

j'ai lu les docs et mis cela dans la Vagranfile:

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

ceci "fonctionne" sauf qu'il écrase tout le contenu de /home/vagrant/src../src qui est vide.

Aucune solution de contournement? J'ai envisagé la possibilité de cloner le repo via git (accessible au public via github) et de synchroniser le dossier vers la VM mais cela ne se sent pas bien et perd les configs de production aussi.

12
demandé sur John Bachir 2014-12-09 20:03:10

7 réponses

Mon Vagrantfile ressemble à ceci:

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

Comme vous pouvez le voir ici, j'ai la même déclaration comme la vôtre! Ici mon repo (vous pouvez essayer comme exemple), et ça marche pour moi! J'utilise PhpStorm pour ouvrir ce repo et éditer des fichiers et toutes les mises à jour automatiquement et synchroniser de ma machine hôte (mon ordinateur portable) à la machine invitée (virtuelle).

dans votre cas, vous faites tout droit, et vagrant a remplace tout le contenu de /home/vagrant/src avec ceux de la ../src. C'est le bon comportement!!! Vous devez mettre votre code dans src dir sur votre machine hôte (votre ordinateur portable) pas sur votre machine invitée (virtuelle)!

4
répondu Vladimir Kovpak 2018-09-11 15:30:11

on dirait que vous cherchez une synchronisation bidirectionnelle. Si ma compréhension est correcte ce réponse va vous aider. Veuillez noter que je n'ai pas encore testé ces. Semble que la clé est d'utiliser virtualbox sync tapez.

type (string) - Le type de dossier synchronisé. Si cela n'est pas spécifié, Vagrant choisira automatiquement la meilleure option de dossier synchronisé pour votre environnement. Sinon, vous pouvez spécifier un type particulier comme "NFS."

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

alors encore une fois selon doc,

si vous utilisez le fournisseur Vagrant VirtualBox, alors VirtualBox les dossiers partagés sont le type de dossier synchronisé par défaut. Ces synchronisés les dossiers utilisent le système de dossiers partagés VirtualBox pour synchroniser les changements de fichiers de l'invité à l'hôte et vice versa.

par conséquent, je ne suis pas sûr de savoir pourquoi votre type par défaut n'est pas virtualbox. De toute façon, cela vaut le coup je pense. Plus loin dans docs il semble y avoir un bug dans le type de boîte virtuelle expliqué dans docs. Veuillez suivre les les étapes ici si vous utilisez la boîte virtuelle sync type.

6
répondu Rajind Ruparathna 2017-06-01 02:33:05

j'ai déterminé que le problème n'est pas que config.vm.synced_folder '../src', '/home/vagrant/src' remplace /home/vagabond/src. Le problème est que home/vagrant/src devient un nouveau type de répertoire différent dans le système de fichiers qui est vide. Il suffit donc de le repeupler après avoir configuré le répertoire partagé. Si...

  1. guest: sudo mv home/vagrant/src home/vagrant/src-back
  2. arrêt guest
  3. ajouter un nouveau dossier synchronisé à Vagrantfile: config.vm.synced_folder '../src', '/home/vagrant/src'
  4. démarrer guest
  5. sur les hôtes: sudo mv home/vagrant/src-back/* home/vagrant/src-back/

Et les choses devraient bien fonctionner à l'avenir.

3
répondu John Bachir 2017-06-01 22:15:56

Vous pouvez utiliser rsync avec Vagrant, il a un support intégré. Voici le lien à la documentation. Alors qu'il est trivial pour rsync pour ignorer les fichiers excessifs à la cible (probablement le comportement par défaut), vous pouvez toujours synchroniser avec précision en protégeant vos fichiers cibles en utilisant protect filtre.

contrairement au montage,rsync doit être déclenché manuellement. Cependant, vous pouvez toujours utiliser Vagrant rsync-auto fonctionnalité documentée ici pour un simple système de fichiers de la montre.

1
répondu hurturk 2017-06-07 11:19:57

on dirait que vous voulez partager un dossier la machine hôte la machine hôte qui est un peu à l'opposé de ce que font les dossiers partagés normaux.

avez-vous pensé à fournir NFS sur l'invité, et ensuite utiliser vagrant-déclencheurs pour monter la part de l'invité sur l'hôte.

tout d'abord, installez vagrant-triggers:

vagrant plugin install vagrant-triggers

alors ayez un Vagrantfile comme ceci:

# 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

c'est une configuration inhabituelle, mais je l'AI testée maintenant avec un hôte Ubuntu et un invité Debian et cela semble fonctionner - YMMV.

1
répondu madebydavid 2018-09-11 15:36:07

je travaille avec vagrant avec cette structure:

Vagrantfile
MyCode.php

et Vagrantfile contient:

config.vm.synced_folder".", "/vagabond"

cela signifie que MyCode.php est visible à l'intérieur de vagrant machine dans /vagrant folder. Je peux éditer ce fichier depuis vagrant machine (l'invité) et depuis ma machine (l'hôte).

0
répondu sensorario 2017-06-06 20:33:26

j'ai utilisé le hack suivant pour rsync le dossier de guest to host:

  • tout d'abord, récupérez la configuration SSH pour la boîte et enregistrez-la sur ssh_config

$ vagrant ssh-config > ssh_config

  • alors utilisez rsync le dossier invité à l'hôte avec la configuration donnée

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

ça a marché pour moi et j'espère que ça marchera pour toi!

0
répondu tonejito 2018-04-23 10:58:45