From 00ec6102d993a752bd8dfb4ee393a4e58e59a4fe Mon Sep 17 00:00:00 2001 From: Brian Goff Date: Wed, 10 Feb 2016 12:02:52 -0500 Subject: [PATCH] Probe all drivers if volume driver not specified This fixes an issue where `docker run -v foo:/bar --volume-driver ` -> daemon restart -> `docker run -v foo:/bar` would make a `local` volume after the restart instead of using the existing volume from the remote driver. Signed-off-by: Brian Goff --- daemon/volumes.go | 2 +- .../docker_cli_start_volume_driver_unix_test.go | 13 +++++++++++++ volume/store/store.go | 13 ++++++++++++- volume/volume_test.go | 4 ++-- volume/volume_unix.go | 3 --- 5 files changed, 28 insertions(+), 7 deletions(-) diff --git a/daemon/volumes.go b/daemon/volumes.go index 7e2c417b2b..cf0e11c6c4 100644 --- a/daemon/volumes.go +++ b/daemon/volumes.go @@ -117,7 +117,7 @@ func (daemon *Daemon) registerMountPoints(container *container.Container, hostCo return derr.ErrorCodeMountDup.WithArgs(bind.Destination) } - if len(bind.Name) > 0 && len(bind.Driver) > 0 { + if len(bind.Name) > 0 { // create the volume v, err := daemon.volumes.CreateWithRef(bind.Name, bind.Driver, container.ID, nil) if err != nil { diff --git a/integration-cli/docker_cli_start_volume_driver_unix_test.go b/integration-cli/docker_cli_start_volume_driver_unix_test.go index 3945d30f3a..d3dff63d9c 100644 --- a/integration-cli/docker_cli_start_volume_driver_unix_test.go +++ b/integration-cli/docker_cli_start_volume_driver_unix_test.go @@ -16,6 +16,7 @@ import ( "time" "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/engine-api/types" "github.com/go-check/check" ) @@ -410,3 +411,15 @@ func (s *DockerExternalVolumeSuite) TestExternalVolumeDriverGet(c *check.C) { c.Assert(s.ec.gets, check.Equals, 1) c.Assert(out, checker.Contains, "No such volume") } + +func (s *DockerExternalVolumeSuite) TestExternalVolumeDriverWithDaemnRestart(c *check.C) { + dockerCmd(c, "volume", "create", "-d", "test-external-volume-driver", "--name", "abc") + err := s.d.Restart() + c.Assert(err, checker.IsNil) + + dockerCmd(c, "run", "--name=test", "-v", "abc:/foo", "busybox", "true") + var mounts []types.MountPoint + inspectFieldAndMarshall(c, "test", "Mounts", &mounts) + c.Assert(mounts, checker.HasLen, 1) + c.Assert(mounts[0].Driver, checker.Equals, "test-external-volume-driver") +} diff --git a/volume/store/store.go b/volume/store/store.go index 0d227ae01a..c770341310 100644 --- a/volume/store/store.go +++ b/volume/store/store.go @@ -186,12 +186,23 @@ func (s *VolumeStore) create(name, driverName string, opts map[string]string) (v return v, nil } - logrus.Debugf("Registering new volume reference: driver %s, name %s", driverName, name) + // Since there isn't a specified driver name, let's see if any of the existing drivers have this volume name + if driverName == "" { + v, _ := s.getVolume(name) + if v != nil { + return v, nil + } + } + + logrus.Debugf("Registering new volume reference: driver %q, name %q", driverName, name) vd, err := volumedrivers.GetDriver(driverName) if err != nil { return nil, &OpErr{Op: "create", Name: name, Err: err} } + if v, _ := vd.Get(name); v != nil { + return v, nil + } return vd.Create(name, opts) } diff --git a/volume/volume_test.go b/volume/volume_test.go index d3e7acc779..6e7bd20c6f 100644 --- a/volume/volume_test.go +++ b/volume/volume_test.go @@ -167,10 +167,10 @@ func TestParseMountSpecSplit(t *testing.T) { {"/tmp:/tmp2:ro", "", "/tmp2", "/tmp", "", "", false, false}, {"/tmp:/tmp3:rw", "", "/tmp3", "/tmp", "", "", true, false}, {"/tmp:/tmp4:foo", "", "", "", "", "", false, true}, - {"name:/named1", "", "/named1", "", "name", "local", true, false}, + {"name:/named1", "", "/named1", "", "name", "", true, false}, {"name:/named2", "external", "/named2", "", "name", "external", true, false}, {"name:/named3:ro", "local", "/named3", "", "name", "local", false, false}, - {"local/name:/tmp:rw", "", "/tmp", "", "local/name", "local", true, false}, + {"local/name:/tmp:rw", "", "/tmp", "", "local/name", "", true, false}, {"/tmp:tmp", "", "", "", "", "", true, true}, } } diff --git a/volume/volume_unix.go b/volume/volume_unix.go index ddf278f07f..9f3177a37c 100644 --- a/volume/volume_unix.go +++ b/volume/volume_unix.go @@ -97,9 +97,6 @@ func ParseMountSpec(spec, volumeDriver string) (*MountPoint, error) { if len(source) == 0 { mp.Source = "" // Clear it out as we previously assumed it was not a name mp.Driver = volumeDriver - if len(mp.Driver) == 0 { - mp.Driver = DefaultDriverName - } // Named volumes can't have propagation properties specified. // Their defaults will be decided by docker. This is just a // safeguard. Don't want to get into situations where named