Vagrant:如何将文件夹从访客同步回主机?

问题描述 投票:18回答:8

为什么,因为很难通过来宾中的遗留编辑器来处理和编辑代码。流浪者的整个目的是为开发人员更容易,对吧:)?

因此,我请有人在这种情况下指导我:

  • 需要在项目上工作。这是git repo。需要mysql,php等等。
  • VM工作得很好(提供)
  • 但是通过ssh和“遗留”编辑器编辑此repo中的文件并不那么容易。想要使用最喜欢的IDE。

VM回购在/home/vagrant/src。我希望它在主机的../src中可见/可编辑。

我阅读了文档并在Vagranfile中推出了这个文档:

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

这“工作”除了它覆盖/home/vagrant/src中的所有内容和来自../src的内容为空。

任何解决方法?我考虑过通过git克隆repo的可能性(通过github公开获得)并将文件夹同步到VM,但这感觉不对,也失去了生产配置。

vagrant virtualbox
8个回答
5
投票

我的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

正如你在这里看到的,我和你的声明一样! Here my repo(你可以试试这个例子),它对我有用!我使用PhpStorm打开此repo并自动编辑文件和所有更新,并从我的主机(我的笔记本电脑)同步到客户机(虚拟)。

在你的情况下,你做得很好,并且vagrant必须覆盖/home/vagrant/src中的所有内容和来自../src的内容。这是正确的行为!您需要将代码放入主机(您的笔记本电脑)上的src目录中,而不是在您的客户机上(虚拟)!


6
投票

好像你正在寻找双向同步。如果我的理解是正确的,这个answer会帮助你。请注意,我还没有测试过这些。似乎关键是使用virtualbox同步type

type(string) - 同步文件夹的类型。如果未指定,则Vagrant将自动为您的环境选择最佳的同步文件夹选项。否则,您可以指定特定类型,例如“nfs”。

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

然后再根据this doc

如果您使用的是Vagrant VirtualBox提供程序,则VirtualBox共享文件夹是默认的同步文件夹类型。这些同步文件夹使用VirtualBox共享文件夹系统来同步从guest虚拟机到主机的文件更改,反之亦然。

因此,我不确定为什么您的默认类型不是virtualbox。无论如何,这是值得一试的我猜。进一步进入文档似乎是在文档中解释的虚拟框类型中的错误。如果您打算使用虚拟盒同步类型,请关注steps here


4
投票

我已经确定问题不是config.vm.synced_folder '../src', '/home/vagrant/src'覆盖/ home / vagrant / src。问题是home / vagrant / src成为文件系统中一个新的不同类型的目录,它是空的。因此,只需在设置共享目录后重新填充它。所以...

  1. 嘉宾: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/

事情应该会很好地发展。


3
投票

听起来您想要使用主机与来宾计算机共享文件夹,这与普通共享文件夹的作用相反。

您是否考虑过在客户机上配置NFS,然后使用vagrant-triggers将来自guest虚拟机的共享挂载到主机上。

首先安装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。


1
投票

你可以使用rsync和Vagrant,它有内置的支持。这是文档中的link。虽然rsync忽略目标上的过多文件(可能是默认行为)是微不足道的,但您仍然可以通过使用protect filter保护目标文件来准确同步。

与安装不同,rsync必须手动触发。但是,您仍然可以使用Vagrant的rsync-auto功能记录here作为简单的文件系统监视。


1
投票

我使用以下hack从guest虚拟机到主机rsync文件夹:

  • 首先,获取该框的SSH配置并将其保存在ssh_config

$ vagrant ssh-config > ssh_config

  • 然后使用rsync guest文件夹返回给定配置的主机

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

它对我有用,我希望它适合你!


0
投票

我使用这种结构与vagrant一​​起工作:

Vagrantfile
MyCode.php

和Vagrantfile包含:

config.vm.synced_folder“。”,“/ vagrant”

这意味着MyCode.php在/ vagrant文​​件夹中的vagrant机器内可见。我可以从流浪汉机器(客人)和我的机器(主机)编辑该文件。


0
投票

Vagrant有插件可以帮助在Guest和Host OS之间复制文件和文件夹。

安装vagrant-vbguestvagrant-scp:

$ vagrant plugin install vagrant-vbguest
$ vagrant plugin install vagrant-scp

要在Vagrant主机和来宾VM之间复制文件或目录,您需要知道来宾VM的ID或名称。

可以在以下命令的输出中找到此信息:

$ vagrant global-status

将文件或目录从Vagrant主机复制到来宾VM:

$ vagrant scp <some_local_file_or_dir> <vm_name>:<some_path_on_vm>

将文件或目录从来宾VM复制到Vagrant主机:

$ vagrant scp <vm_name>:<some_file_or_dir_on_vm> <some_local_path>
© www.soinside.com 2019 - 2024. All rights reserved.