2017-10-07 6 views
0

私の目標は、DockerまたはVirtualBoxのどちらかを--providerフラグ(例:vagrant up --provider = virtualbox)を使って選択できる1つのVagrantfileを作成することです。 Dockerプロバイダが私のボックスに互換性がないと言っているので、私は問題に遭遇しています。これは本当ですが、私はDockerにこのボックスを使用させたくありません。 Dockerが使用するために指しているDockerfileがあります。 VirtualBoxがプロバイダの場合にのみボックスを使用したいと思っています。 Dockerプロバイダにボックス宣言を無視させる方法、またはVirtualBoxがプロバイダである場合にのみボックス宣言を実行させる方法はありますか?それぞれ異なるボックスを使用する複数のプロバイダに対して、どのようにバグログファイルを作成しますか?

これは私のVagrantfileです:

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.box = "ubuntu/trusty64" # <--------- this is the line the Docker provider chokes on 
    config.vm.provider "virtualbox" do |v| 
    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 

答えて

1

あなただけの問題は根本的にベイグラントは、そのボックスの組み込み前提を持っているという事実に降りてくるプロバイダ

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 
+0

てみましたか?それは動作しません。 'config.vm.provider'は条件文ではありません。ファイルが解析されると 'config.vm.provider'へのすべての呼び出しが行われます。 – hekevintran

+1

@hekevintran、更新された答えを確認してください –

+0

ああ良い見つける、オーバーライドは答えです!ありがとう! – hekevintran

0

に基づいてそのボックスの状態を移動する必要がありますプロバイダは完全に独立しており、任意の組み合わせでスワップできます。本当じゃない。ボックスは、それが動作するように設計されているプロバイダとのみ互換性があります。正しい設計は、各プロバイダがボックスをグローバル値にするのではなく、独自のボックスを指定することを可能にします。このデザインはすでにDockerプロバイダに存在し、Dockerイメージを選択できますが、他のプロバイダには存在しません。私が懸念している限り、これはバージュのバグです。これに

私のソリューションは、渡されたプロバイダの引数を解析し、if文で、プロバイダの宣言をラップすることです:あなたはこれを実行するために

require 'optparse' 

def get_provider 
    ret = nil 
    opt_parser = OptionParser.new do |opts| 
    opts.on("--provider provider") do |provider| 
     ret = provider 
    end 
    end 
    opt_parser.parse!(ARGV) 
    ret 
end 
provider = get_provider || "virtualbox" 

PROJECT_ROOT = File.expand_path(File.join(File.dirname(File.expand_path(__FILE__)), '..')) 

Vagrant.require_version ">= 1.7.0" 

Vagrant.configure('2') do |config| 
    if provider == "docker" 
    config.vm.provider "docker" do |d| 
     d.build_dir = "." 
     d.has_ssh = true 
    end 
    end 

    if provider == "virtualbox" 
    config.vm.box = "ubuntu/trusty64" 
    config.vm.provider "virtualbox" do |v| 
     v.gui = true 
    end 
    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 
関連する問題