在MacOS上使用docker作为提供程序的Vagrant,无法在容器

时间:2015-12-19 16:17:20

标签: docker vagrant boot2docker

我使用vagrant而不是让我们说docker-compose,因为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机器上运行它,因此路径不存在并失败。但是我不能设置相对路径,因为docker需要一个绝对路径

那么有什么解决方法吗? (在创建自己的虚拟框之外我然后安装流浪汉并从那里运行命令)

2 个答案:

答案 0 :(得分:1)

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

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

在此Vagrantfile中,您可以将文件夹同步(在MacOS和Docker主机VM之间)配置为可在docker卷配置中使用的某个已知绝对路径。

要使其基于Vagrant Host OS成为条件,您可以将其置于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

答案 1 :(得分:0)

为了在Mac OS X和Vagrant上运行,您有两种选择。我前面在https://gist.github.com/andyshinn/8c88974daf8204da32f7处就另一个类似问题提出了一个例子。

这里的重要部分是ruby -e "require 'socket'; begin sock = Socket.new(Socket::Constants::AF_INET, Socket::Constants::SOCK_STREAM, 0); sock.bind(Socket.pack_sockaddr_in(YOUR_PORT_HERE, '0.0.0.0')); exit(0); rescue Errno::EADDRINUSE; exit(1); end" 行。如果您的Vagrant VM支持NFS(boot2docker不支持),那么您可以使用NFS。否则,rsync方法将适用于boot2docker等机器。

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