我使用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需要一个绝对路径
那么有什么解决方法吗? (在创建自己的虚拟框之外我然后安装流浪汉并从那里运行命令)
答案 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框。