Vagrant: как синхронизировать папку с гостем обратно на хост?

почему, потому что трудно работать и редактировать код через устаревшие Редакторы в гостях. Вся цель vagrant - быть более легким для разработчика, верно:)?

как таковой я прошу кого-то вести меня в этой ситуации:

  • нужно работать над проектом. Это git repo. Требуется mysql, php и т. д.
  • VM отлично работает (при условии)
  • но редактирование файлов в этом РЕПО не так просто через ssh и" устаревшие " Редакторы. Захотите использовать любимый IDE.

на репо VM находится в /home/vagrant/src. Я хочу, чтобы он был видимым/редактируемым в ../src в хост.

Я прочитал документы и поместил это в Vagranfile:

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

это "работает", за исключением того, что он переписывает все содержимое из /home/vagrant/src с ../src где пусто.

любой обходной путь? Я рассмотрел возможность клонирования РЕПО через git (общедоступный через github) и синхронизации папки с виртуальной машиной но это не кажется правильным и потерять производственные конфигурации тоже.

7 ответов


мой Vagrantfile выглядит так:

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

как вы можете видеть здесь, у меня есть то же самое заявление, что и у вас! вот мое РЕПО (вы можете попробовать это как пример), и это работает для меня! Я использую PhpStorm для автоматического открытия этого РЕПО и редактирования файлов и всех обновлений и синхронизации с моей хост-машины (моего ноутбука) на гостевую машину (виртуальную).

в вашем случае, у вас все в порядке, и Бродяга должен переписать все содержимое из /home/vagrant/src С ../src. Это правильное поведение!!! Вам нужно поместить свой код в src dir на вашем хост-компьютере (вашем ноутбуке) не на вашей гостевой машине (виртуальной)!


Кажется, что вы ищете двухстороннюю синхронизацию. Если мое понимание правильно, это ответ поможет вам. Обратите внимание, что я еще не тестировал их. Похоже, ключ должен использовать virtualbox синхронизация тип.

type (string) - тип синхронизированной папки. Если это не указано, Vagrant автоматически выберет лучший вариант синхронизированной папки для ваша среда. В противном случае можно указать определенный тип, например "сетевая файловая система."

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

затем снова в соответствии с этот документ,

Если вы используете поставщик Vagrant VirtualBox, то VirtualBox общие папки-это тип синхронизированных папок по умолчанию. Эти синхронизированные папки используйте систему общих папок VirtualBox для синхронизации изменений файлов от гостя к хозяину, и наоборот.

поэтому я не уверен, почему ваш тип по умолчанию не virtualbox. В любом случае, думаю, стоит попробовать. Далее в документах, похоже, есть ошибка в типе виртуального окна, объясненном в документах. Пожалуйста, следуйте за шаги если вы собираетесь использовать тип синхронизации virtual box.


Я определил, что проблема не в этом config.vm.synced_folder '../src', '/home/vagrant/src' перезаписывает / home/vagrant / src. Проблема в том, что home/vagrant/src становится новым каталогом другого типа в файловой системе, который пуст. Таким образом, нужно просто повторно заполнить его после настройки общего каталога. Так...

  1. на Guest: sudo mv home/vagrant/src home/vagrant/src-back
  2. остановка гость
  3. добавить новую синхронизированную папку в Vagrantfile:config.vm.synced_folder '../src', '/home/vagrant/src'
  4. пуск гость
  5. на гостя: sudo mv home/vagrant/src-back/* home/vagrant/src-back/

и все должно хорошо работать в будущем.


можно использовать rsync с Vagrant, он имеет встроенную поддержку. Вот это ссылке в документации. Хотя это тривиально для rsync чтобы игнорировать чрезмерные файлы в target (возможно, поведение по умолчанию), вы все равно можете точно синхронизировать, защищая свои целевые файлы с помощью protect фильтр.

в отличие от монтажа, rsync должен запускаться вручную. Однако, вы все еще можете использовать бродяги rsync-auto функция документирована здесь для a простые часы файловой системы.


похоже, вы хотите поделиться папкой С гостевая машина С хост-машина, которая является своего рода противоположностью тому, что делают обычные общие папки.

вы думали о предоставлении NFS на гостя, а затем с помощью залет-триггеры для монтирования доли от гостя на хост.

первый запуск путем установки vagrant-triggers:

vagrant plugin install vagrant-triggers

есть Vagrantfile как это:
# 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

Это необычная настройка, но я тестировал ее сейчас с хостом Ubuntu и гостем Debian, и, похоже, она работает - YMMV.


Я работаю с бродягой с этой структурой:

Vagrantfile
MyCode.php

и Vagrantfile содержит:

config.виртуальная память.synced_folder ".", "/бродяга"

это означает, что MyCode.php отображается внутри машины vagrant в папке /vagrant. Я могу редактировать этот файл как с бродячей машины (гость), так и с моей машины (хост).


я использовал следующий хак для rsync папку от гостя к хосту:

  • во-первых, получить конфигурацию SSH для коробки и сохранить его на ssh_config

$ vagrant ssh-config > ssh_config

  • затем использовать rsync гостевая папка возвращается на хост с заданной конфигурацией

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

это сработало для меня, и я надеюсь, что это сработает для вас!