diff --git a/plugins/providers/docker/driver.rb b/plugins/providers/docker/driver.rb index fc53926fd..88903039c 100644 --- a/plugins/providers/docker/driver.rb +++ b/plugins/providers/docker/driver.rb @@ -49,14 +49,23 @@ module VagrantPlugins run_cmd += volumes.map { |v| v = v.to_s if v.include?(":") && @executor.windows? - host, guest = v.split(":", 2) - host = Vagrant::Util::Platform.windows_path(host) - # NOTE: Docker does not support UNC style paths (which also - # means that there's no long path support). Hopefully this - # will be fixed someday and the gsub below can be removed. - host.gsub!(/^[^A-Za-z]+/, "") - v = [host, guest].join(":") + if v.index(":") != v.rindex(":") + # If we have 2 colons, the host path is an absolute Windows URL + # and we need to remove the colon from it + host, colon, guest = v.rpartition(":") + host = "//" + host[0].downcase + host[2..-1] + v = [host, guest].join(":") + else + host, guest = v.split(":", 2) + host = Vagrant::Util::Platform.windows_path(host) + # NOTE: Docker does not support UNC style paths (which also + # means that there's no long path support). Hopefully this + # will be fixed someday and the gsub below can be removed. + host.gsub!(/^[^A-Za-z]+/, "") + v = [host, guest].join(":") + end end + ['-v', v.to_s] } run_cmd += %W(--privileged) if params[:privileged] diff --git a/test/unit/plugins/providers/docker/driver_test.rb b/test/unit/plugins/providers/docker/driver_test.rb index 7202a8aa9..fb271af54 100644 --- a/test/unit/plugins/providers/docker/driver_test.rb +++ b/test/unit/plugins/providers/docker/driver_test.rb @@ -65,6 +65,33 @@ describe VagrantPlugins::DockerProvider::Driver do end end + describe '#create windows' do + let(:params) { { + image: 'jimi/hendrix:eletric-ladyland', + cmd: ['play', 'voodoo-chile'], + ports: '8080:80', + volumes: 'C:/Users/BobDylan/AllAlong:/The/Watchtower', + detach: true, + links: [[:janis, 'joplin'], [:janis, 'janis']], + env: {key: 'value'}, + name: cid, + hostname: 'jimi-hendrix', + privileged: true + } } + + let(:translated_path) { "//c/Users/BobDylan/AllAlong:/The/Watchtower" } + + before do + allow(Vagrant::Util::Platform).to receive(:windows?).and_return(true) + subject.create(params) + end + + it 'shares folders' do + expect(cmd_executed).to match(/-v #{translated_path} .+ #{Regexp.escape params[:image]}/) + end + end + + describe '#created?' do let(:result) { subject.created?(cid) }