Probe all drivers if volume driver not specified
This fixes an issue where `docker run -v foo:/bar --volume-driver <remote 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 <cpuguy83@gmail.com> Upstream-commit: 00ec6102d993a752bd8dfb4ee393a4e58e59a4fe Component: engine
This commit is contained in:
@ -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)
|
||||
}
|
||||
|
||||
|
||||
@ -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},
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
Reference in New Issue
Block a user