diff --git a/container.go b/container.go index cea316ae5c..9e4495890a 100644 --- a/container.go +++ b/container.go @@ -716,7 +716,7 @@ func (container *Container) Start() (err error) { for r, v := range container.Volumes { mountAs := "ro" - if container.VolumesRW[v] { + if container.VolumesRW[r] { mountAs = "rw" } diff --git a/mount/mount_test.go b/mount/mount_test.go index 5dc9dc256a..6edc31d410 100644 --- a/mount/mount_test.go +++ b/mount/mount_test.go @@ -48,7 +48,7 @@ func TestMounted(t *testing.T) { } f.Close() - if err := Mount(sourcePath, targetPath, "none", "bind,ro"); err != nil { + if err := Mount(sourcePath, targetPath, "none", "bind,rw"); err != nil { t.Fatal(err) } defer func() { @@ -64,4 +64,47 @@ func TestMounted(t *testing.T) { if !mounted { t.Fatalf("Expected %s to be mounted", targetPath) } + if _, err := os.Stat(targetPath); err != nil { + t.Fatal(err) + } +} + +func TestMountReadonly(t *testing.T) { + tmp := path.Join(os.TempDir(), "mount-tests") + if err := os.MkdirAll(tmp, 0777); err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tmp) + + var ( + sourcePath = path.Join(tmp, "sourcefile.txt") + targetPath = path.Join(tmp, "targetfile.txt") + ) + + f, err := os.Create(sourcePath) + if err != nil { + t.Fatal(err) + } + f.WriteString("hello") + f.Close() + + f, err = os.Create(targetPath) + if err != nil { + t.Fatal(err) + } + f.Close() + + if err := Mount(sourcePath, targetPath, "none", "bind,ro"); err != nil { + t.Fatal(err) + } + defer func() { + if err := Unmount(targetPath); err != nil { + t.Fatal(err) + } + }() + + f, err = os.OpenFile(targetPath, os.O_RDWR, 0777) + if err == nil { + t.Fatal("Should not be able to open a ro file as rw") + } } diff --git a/mount/mounter_linux.go b/mount/mounter_linux.go index 1371f72bd9..dd4280c777 100644 --- a/mount/mounter_linux.go +++ b/mount/mounter_linux.go @@ -5,7 +5,15 @@ import ( ) func mount(device, target, mType string, flag uintptr, data string) error { - return syscall.Mount(device, target, mType, flag, data) + if err := syscall.Mount(device, target, mType, flag, data); err != nil { + return err + } + + // If we have a bind mount or remount, remount... + if flag&syscall.MS_BIND == syscall.MS_BIND && flag&syscall.MS_RDONLY == syscall.MS_RDONLY { + return syscall.Mount(device, target, mType, flag|syscall.MS_REMOUNT, data) + } + return nil } func unmount(target string, flag int) error {