在MacOS上使用docker作为提供者的stream浪者,无法在容器中挂载目录

我使用的是stream浪汉,而不是让我们说docker撰写,因为vagrantfile是一个ruby文件,它给了更多的灵活性

我的Vagrantfile看起来像这样

Vagrant.configure(2) do |config| config.vm.define "db" do |app| app.vm.provider "docker" do |d| d.image = "postgres:9.5" d.name = "myproject_db" d.env = { 'POSTGRES_USER' => "admin", 'POSTGRES_PASSWORD' => "password", } end end config.vm.define "fpm" do |app| app.vm.provider "docker" do |d| d.build_dir = "dockerfiles/php-fpm/" d.name="myproject_fpm" d.link "myproject_db:db" d.volumes = [ "#{ENV['PWD']}/myproject:/var/www/symfony2", ] end end end 

它在Linux硬件主机上工作的很好,但是在Mac上却失败了,因为vagrant up --provider docker将会启动一个中间的linux系统来运行docker。 所以它会失败,因为

  d.volumes = [ "#{ENV['PWD']}/myproject:/var/www/symfony2", ] 

从MacOS机器上取得#{ENV['PWD']} ,但是在linux的机器上运行它,所以path不存在并失败。 不过,我不能把相对path,因为docker需要一个绝对的

那么有没有解决方法? (除了创build自己的虚拟机,然后我安装vagrant并从那里运行命令)

默认情况下,Vagrant Docker提供程序使用boot2docker在Windows和MacOS机器上托pipeDocker。 但是您可以使用vagrant_vagrantfile参数为Docker Host VM指定自定义Vagrant文​​件。 那是:

 d.vagrant_vagrantfile = "../path/to/Vagrantfile" 

在这个Vagrantfile中,您可以将文件夹同步(MacOS和Docker Host VM之间的configuration)configuration为您可以在泊坞窗卷configuration中使用的一些已知的绝对path。

要使其基于Vagrant主机操作系统的条件,你可以把它放在IF块:

 if /darwin/.match(RUBY_PLATFORM) #MACOS optional configuration elsif /mingw|mswin/.match(RUBY_PLATFORM) #Windows optional configuration else #everything else, most probably Linux end 

为了在Mac OS X和Vagrant上运行,您有两个select。 我刚刚在https://gist.github.com/andyshinn/8c88974daf8204da32f7有一个类似的问题的例子。

这里的重要部分是config.vm.synced_folder行。 如果您的Vagrant VM支持NFS(boot2docker不支持),那么您可以使用NFS。 否则,rsync方法将适用于boot2docker等机器。

但是,如果您使用的是Vagrant,我会在Atlas Vagrant框中search支持NFS的boot2docker。