From 71d615212d5aee7d777926acbf244cc40f647540 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 17 Apr 2014 18:07:57 -0700 Subject: [PATCH] providers/docker: can set environmental variables --- plugins/providers/docker/action/create.rb | 1 + plugins/providers/docker/config.rb | 16 +++++++++++++++ plugins/providers/docker/driver.rb | 2 ++ .../plugins/providers/docker/config_spec.rb | 20 +++++++++++++++++++ 4 files changed, 39 insertions(+) diff --git a/plugins/providers/docker/action/create.rb b/plugins/providers/docker/action/create.rb index 6f849814e..0a41239a3 100644 --- a/plugins/providers/docker/action/create.rb +++ b/plugins/providers/docker/action/create.rb @@ -46,6 +46,7 @@ module VagrantPlugins { cmd: @provider_config.cmd, + env: @provider_config.env, extra_args: @provider_config.create_args, hostname: @machine_config.vm.hostname, image: @provider_config.image, diff --git a/plugins/providers/docker/config.rb b/plugins/providers/docker/config.rb index e505176cc..75363d9aa 100644 --- a/plugins/providers/docker/config.rb +++ b/plugins/providers/docker/config.rb @@ -9,6 +9,11 @@ module VagrantPlugins # @return [Array] attr_accessor :create_args + # Environmental variables to set in the container. + # + # @return [Hash] + attr_accessor :env + # True if the Docker container exposes SSH access. If this is true, # then Vagrant can do a bunch more things like setting the hostname, # provisioning, etc. @@ -45,6 +50,7 @@ module VagrantPlugins def initialize @cmd = UNSET_VALUE @create_args = [] + @env = {} @has_ssh = UNSET_VALUE @image = UNSET_VALUE @ports = [] @@ -55,9 +61,19 @@ module VagrantPlugins @vagrant_vagrantfile = UNSET_VALUE end + def merge(other) + super.tap do |result| + env = {} + env.merge!(@env) if @env + env.merge!(other.env) if other.env + result.env = env + end + end + def finalize! @cmd = [] if @cmd == UNSET_VALUE @create_args = [] if @create_args == UNSET_VALUE + @env ||= {} @has_ssh = false if @has_ssh == UNSET_VALUE @image = nil if @image == UNSET_VALUE @privileged = false if @privileged == UNSET_VALUE diff --git a/plugins/providers/docker/driver.rb b/plugins/providers/docker/driver.rb index 0d679501a..d624547c7 100644 --- a/plugins/providers/docker/driver.rb +++ b/plugins/providers/docker/driver.rb @@ -20,8 +20,10 @@ module VagrantPlugins volumes = Array(params[:volumes]) name = params.fetch(:name) cmd = Array(params.fetch(:cmd)) + env = params.fetch(:env) run_cmd = %W(docker run --name #{name} -d) + run_cmd += env.map { |k,v| ['-e', "#{k}=#{v}"] } run_cmd += ports.map { |p| ['-p', p.to_s] } run_cmd += volumes.map { |v| ['-v', v.to_s] } run_cmd += %W(--privileged) if params[:privileged] diff --git a/test/unit/plugins/providers/docker/config_spec.rb b/test/unit/plugins/providers/docker/config_spec.rb index 764986fa3..e89b477e5 100644 --- a/test/unit/plugins/providers/docker/config_spec.rb +++ b/test/unit/plugins/providers/docker/config_spec.rb @@ -25,6 +25,7 @@ describe VagrantPlugins::DockerProvider::Config do before { subject.finalize! } its(:cmd) { should eq([]) } + its(:env) { should eq({}) } its(:image) { should be_nil } its(:privileged) { should be_false } its(:vagrant_machine) { should be_nil } @@ -40,4 +41,23 @@ describe VagrantPlugins::DockerProvider::Config do subject.finalize! assert_valid end + + describe "#merge" do + context "env vars" do + let(:one) { described_class.new } + let(:two) { described_class.new } + + subject { one.merge(two) } + + it "should merge the values" do + one.env["foo"] = "bar" + two.env["bar"] = "baz" + + expect(subject.env).to eq({ + "foo" => "bar", + "bar" => "baz", + }) + end + end + end end