繁体   English   中英

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

[英]Vagrant: How to sync folder from guest back to host?

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

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

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

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

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

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

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

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

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

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

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

然后再根据这个文档

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

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

我的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打开此repo并自动编辑文件和所有更新,并从我的主机(我的笔记本电脑)同步到客户机(虚拟)。

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

我已经确定问题不在于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/

事情应该会很好地发展。

这听起来像你想客户机上位机,这是什么样的正常共享文件夹做相反的共享文件夹。

您是否考虑过在guest 虚拟机上配置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。

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

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

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

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

$ vagrant ssh-config > ssh_config

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

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

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

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

Vagrantfile
MyCode.php

和Vagrantfile包含:

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

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

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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM