diff --git a/daemon/volumes.go b/daemon/volumes.go index a85d14f10d..f4035992ef 100644 --- a/daemon/volumes.go +++ b/daemon/volumes.go @@ -191,11 +191,16 @@ func (daemon *Daemon) registerMountPoints(container *Container, hostConfig *runc } for _, m := range c.MountPoints { - cp := m - cp.RW = m.RW && mode != "ro" + cp := &mountPoint{ + Name: m.Name, + Source: m.Source, + RW: m.RW && mode != "ro", + Driver: m.Driver, + Destination: m.Destination, + } - if len(m.Source) == 0 { - v, err := createVolume(m.Name, m.Driver) + if len(cp.Source) == 0 { + v, err := createVolume(cp.Name, cp.Driver) if err != nil { return err } diff --git a/integration-cli/docker_cli_run_test.go b/integration-cli/docker_cli_run_test.go index 98bc409f5d..a961fd5511 100644 --- a/integration-cli/docker_cli_run_test.go +++ b/integration-cli/docker_cli_run_test.go @@ -3233,3 +3233,21 @@ func (s *DockerSuite) TestRunCapAddCHOWN(c *check.C) { c.Fatalf("expected output ok received %s", actual) } } + +// https://github.com/docker/docker/pull/14498 +func (s *DockerSuite) TestVolumeFromMixedRWOptions(c *check.C) { + dockerCmd(c, "run", "--name", "parent", "-v", "/test", "busybox", "true") + dockerCmd(c, "run", "--volumes-from", "parent:ro", "--name", "test-volumes-1", "busybox", "true") + dockerCmd(c, "run", "--volumes-from", "parent:rw", "--name", "test-volumes-2", "busybox", "true") + + testRO, err := inspectFieldMap("test-volumes-1", ".VolumesRW", "/test") + c.Assert(err, check.IsNil) + if testRO != "false" { + c.Fatalf("Expected RO volume was RW") + } + testRW, err := inspectFieldMap("test-volumes-2", ".VolumesRW", "/test") + c.Assert(err, check.IsNil) + if testRW != "true" { + c.Fatalf("Expected RW volume was RO") + } +}