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.
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)!
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.
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...
- guest:
sudo mv home/vagrant/src home/vagrant/src-back
- arrêt guest
- ajouter un nouveau dossier synchronisé à Vagrantfile:
config.vm.synced_folder '../src', '/home/vagrant/src'
- démarrer guest
- sur les hôtes:
sudo mv home/vagrant/src-back/* home/vagrant/src-back/
Et les choses devraient bien fonctionner à l'avenir.
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.
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.
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).
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!