Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker 如何为多个提供者编写一个文件,每个提供者使用不同的框?_Docker_Vagrant_Virtualbox - Fatal编程技术网

Docker 如何为多个提供者编写一个文件,每个提供者使用不同的框?

Docker 如何为多个提供者编写一个文件,每个提供者使用不同的框?,docker,vagrant,virtualbox,Docker,Vagrant,Virtualbox,我的目标是创建一个vagrant文件,在其中我可以使用--provider标志选择使用Docker或VirtualBox(例如,vagrant up--provider=VirtualBox)。我遇到了一个问题,因为Docker提供商说我的箱子不兼容。这是真的,但我不希望Docker使用这个盒子;我有一个Docker文件供Docker使用。我希望仅当VirtualBox是提供者时才使用该框。如何使Docker提供程序忽略box声明,或仅当VirtualBox是提供程序时才运行box声明 这是我的

我的目标是创建一个vagrant文件,在其中我可以使用--provider标志选择使用Docker或VirtualBox(例如,vagrant up--provider=VirtualBox)。我遇到了一个问题,因为Docker提供商说我的箱子不兼容。这是真的,但我不希望Docker使用这个盒子;我有一个Docker文件供Docker使用。我希望仅当VirtualBox是提供者时才使用该框。如何使Docker提供程序忽略box声明,或仅当VirtualBox是提供程序时才运行box声明

这是我的档案:

Vagrant.require\u版本“>=1.7.0”
Vagrant.configure('2')do | config|
PROJECT\u ROOT=File.expand\u path(File.join(File.dirname(File.expand\u path(\uu File\uuu)),“…”)
config.vm.provider“docker”do | d|
d、 build_dir=“”
d、 has_ssh=true
结束

config.vm.box=“ubuntu/trusty64”#您只需要根据提供程序移动该框条件

Vagrant.require_version ">= 1.7.0"

Vagrant.configure('2') do |config|
  PROJECT_ROOT = File.expand_path(File.join(File.dirname(File.expand_path(__FILE__)), '..'))

  config.vm.provider "docker" do |d|
    d.build_dir = "."
    d.has_ssh = true
  end

  config.vm.provider "virtualbox" do |v, override|
    override.vm.box = "ubuntu/trusty64"
    v.gui = true
  end

  config.vm.network :forwarded_port, guest: 80, host: 9002
  config.vm.network :forwarded_port, guest: 9000, host: 9000
  config.vm.network :forwarded_port, guest: 9001, host: 9001

  config.vm.synced_folder PROJECT_ROOT, '/srv'

  config.vm.provision :ansible do |ansible|
    ansible.verbose = "v"
    ansible.playbook = 'provisioning/playbook.yml'
  end
end

您只需要根据提供程序移动该框条件

Vagrant.require_version ">= 1.7.0"

Vagrant.configure('2') do |config|
  PROJECT_ROOT = File.expand_path(File.join(File.dirname(File.expand_path(__FILE__)), '..'))

  config.vm.provider "docker" do |d|
    d.build_dir = "."
    d.has_ssh = true
  end

  config.vm.provider "virtualbox" do |v, override|
    override.vm.box = "ubuntu/trusty64"
    v.gui = true
  end

  config.vm.network :forwarded_port, guest: 80, host: 9002
  config.vm.network :forwarded_port, guest: 9000, host: 9000
  config.vm.network :forwarded_port, guest: 9001, host: 9001

  config.vm.synced_folder PROJECT_ROOT, '/srv'

  config.vm.provision :ansible do |ansible|
    ansible.verbose = "v"
    ansible.playbook = 'provisioning/playbook.yml'
  end
end

问题从根本上归结为这样一个事实:Vagrant有一个内置的假设,即盒子和提供者是完全独立的,可以以任何组合进行交换。事实并非如此。长方体仅与设计用于使用的提供程序兼容。正确的设计将允许每个提供程序指定自己的框,而不是将框作为全局值。此设计已存在于Docker提供程序中,允许您选择Docker映像,但不存在于任何其他提供程序中。就我而言,这是《流浪汉》中的一个错误

我的解决方案是解析传递的provider参数,并将provider声明封装在if语句中:

需要“optpass”
def get_提供程序
ret=零
opt|parser=OptionParser.new do | opts|
选项on(“--provider provider”)do | provider|
ret=提供者
结束
结束
opt_parser.parse!(ARGV)
ret
结束
provider=get_provider | |“virtualbox”
PROJECT\u ROOT=File.expand\u path(File.join(File.dirname(File.expand\u path(\uu File\uuu)),“…”)
Vagrant.require_版本“>=1.7.0”
Vagrant.configure('2')do | config|
如果提供程序==“docker”
config.vm.provider“docker”do | d|
d、 build_dir=“”
d、 has_ssh=true
结束
结束
如果提供程序==“virtualbox”
config.vm.box=“ubuntu/trusty64”
config.vm.provider“virtualbox”do | v|
v、 gui=true
结束
结束
config.vm.network:forwarded_端口,来宾:80,主机:9002
config.vm.network:forwarded_端口,来宾:9000,主机:9000
config.vm.network:forwarded_port,guest:9001,host:9001
config.vm.synced_文件夹项目_根,“/srv”
config.vm.provision:ansible do | ansible|
ansible.verbose=“v”
ansible.playbook='provisioning/playbook.yml'
结束
结束

问题从根本上归结为这样一个事实:Vagrant有一个内置的假设,即盒子和提供者是完全独立的,可以以任何组合进行交换。事实并非如此。长方体仅与设计用于使用的提供程序兼容。正确的设计将允许每个提供程序指定自己的框,而不是将框作为全局值。此设计已存在于Docker提供程序中,允许您选择Docker映像,但不存在于任何其他提供程序中。就我而言,这是《流浪汉》中的一个错误

我的解决方案是解析传递的provider参数,并将provider声明封装在if语句中:

需要“optpass”
def get_提供程序
ret=零
opt|parser=OptionParser.new do | opts|
选项on(“--provider provider”)do | provider|
ret=提供者
结束
结束
opt_parser.parse!(ARGV)
ret
结束
provider=get_provider | |“virtualbox”
PROJECT\u ROOT=File.expand\u path(File.join(File.dirname(File.expand\u path(\uu File\uuu)),“…”)
Vagrant.require_版本“>=1.7.0”
Vagrant.configure('2')do | config|
如果提供程序==“docker”
config.vm.provider“docker”do | d|
d、 build_dir=“”
d、 has_ssh=true
结束
结束
如果提供程序==“virtualbox”
config.vm.box=“ubuntu/trusty64”
config.vm.provider“virtualbox”do | v|
v、 gui=true
结束
结束
config.vm.network:forwarded_端口,来宾:80,主机:9002
config.vm.network:forwarded_端口,来宾:9000,主机:9000
config.vm.network:forwarded_port,guest:9001,host:9001
config.vm.synced_文件夹项目_根,“/srv”
config.vm.provision:ansible do | ansible|
ansible.verbose=“v”
ansible.playbook='provisioning/playbook.yml'
结束
结束

您是否尝试运行此操作?它不起作用
config.vm.provider
不是条件语句。在分析文件时,所有对
config.vm.provider
的调用都是如此。是否尝试运行此操作?它不起作用
config.vm.provider
不是条件语句。分析文件时,所有对
config.vm.provider的调用都会进行分析。