在Vagrantfile中手动指定.vagrant文件夹的位置

7

我有一个Vagrantfile文件夹,它在构建过程中被自动生成,所以它会被清理掉,但我仍然想使用创建的虚拟机。最简单的方法是将.vagrant文件夹放到自动生成的文件夹以外的地方。这个可行吗?

3个回答

9
您至少有两个选项:
  1. 使用 VAGRANT_DOTFILE_PATH 来设置存储项目特定数据的位置(默认为 .vagrant,如您所知)。请注意,路径必须是项目/Vagrantfile 特定的。
  2. cd 到您想要创建 .vagrant 目录的目录,并使用 VAGRANT_VAGRANTFILE 指定生成的 Vagrantfile 的路径。

根据Vagrant的文档,VAGRANT_VAGRANTFILE“不是文件路径,而只是文件名。”。 - Jhack

4

我知道这是一个老问题,但对于那些通过谷歌搜索到这里的人来说,如果你真的想指定元数据目录而不必每次手动修改环境变量,有一个解决方法。只需将以下内容放在您的Vagrantfile顶部:


VAGRANT_DOTFILE_PATH = 'custom/dotfile/path'
if(ENV['VAGRANT_DOTFILE_PATH'].nil? && '.vagrant' != VAGRANT_DOTFILE_PATH)
    puts 'changing metadata directory to ' + VAGRANT_DOTFILE_PATH
    ENV['VAGRANT_DOTFILE_PATH'] = VAGRANT_DOTFILE_PATH
    puts 'removing default metadata directory ' + FileUtils.rm_r('.vagrant').join("\n")
    system 'vagrant ' + ARGV.join(' ')
    ENV['VAGRANT_DOTFILE_PATH'] = nil #for good measure
    abort 'Finished'
end

由于我的开发目录位于nfs上,当多个主机尝试运行其虚拟机时,.vagrant目录会出现问题。这似乎可以解决它。 - spuriousdata
这对我不起作用。它打印了“warning: already initialized constant VAGRANT_DOTFILE_PATH”四次,然后在abort行立即退出。 - l0b0

0

我希望每个提供者都使用单独的Vagrant目录,以便能够轻松地在它们之间进行切换。我无法让@hairraisin's solution起作用,但基于此,我最终得到了以下解决方案:

Vagrant.configure('2') do |config|
  config.vm.provider :lxd do |lxd, override|
    if ENV['VAGRANT_DOTFILE_PATH'].nil?
      ENV['VAGRANT_DOTFILE_PATH'] = '.vagrant-lxd'
      puts 'Removing default metadata directory ' + FileUtils.rm_r('.vagrant').join("\n")
      exec 'vagrant ' + ARGV.map{|arg| Shellwords.escape arg}.join(' ')
    end

这样可以避免无限递归或过早的abort。使用exec而不是system可以避免每个vagrant命令都产生非零退出代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接