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

时间:2014-12-09 17:03:11

标签: vagrant virtualbox

为什么,因为很难通过来宾中的旧版编辑器来处理和编辑代码。对于开发者来说,流浪者的目的更容易,对吧:)?

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

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

虚拟机仓库位于/home/vagrant/src。 我希望它在主机的../src中可见/可编辑。

我阅读了文档,并在Vagran文件中推出了这个文档:

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

此“有效”,但它会覆盖/home/vagrant/src中的所有内容和来自../src的内容为空的内容。

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

8 个答案:

答案 0 :(得分:6)

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

  

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

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

然后再根据this doc

  

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

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

答案 1 :(得分:5)

我的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 看起来像这样:

/home/vagrant/src

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

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

答案 2 :(得分: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/
  6. 事情应该会顺利进行。

答案 3 :(得分: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。

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

我使用以下hack来将文件夹从guest虚拟机转发到主机:

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

$ vagrant ssh-config > ssh_config

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

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

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

答案 6 :(得分:0)

我和这种结构的流浪汉一起工作:

Vagrantfile
MyCode.php

和Vagrantfile包含:

config.vm.synced_folder&#34;。&#34;,&#34; / vagrant&#34;

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

答案 7 :(得分:0)

Vagrant具有插件,可帮助在Guest OS和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>