func MakePrivate(mountPoint string) error { mounted, err := mount.Mounted(mountPoint) if err != nil { return err } if !mounted { if err := mount.Mount(mountPoint, mountPoint, "none", "bind,rw"); err != nil { return err } } return mount.ForceMount("", mountPoint, "none", "private") }
// Test recursive bind mount works by default func TestDockerRunWithVolumesIsRecursive(t *testing.T) { tmpDir, err := ioutil.TempDir("", "docker_recursive_mount_test") if err != nil { t.Fatal(err) } defer os.RemoveAll(tmpDir) // Create a temporary tmpfs mount. tmpfsDir := filepath.Join(tmpDir, "tmpfs") if err := os.MkdirAll(tmpfsDir, 0777); err != nil { t.Fatalf("failed to mkdir at %s - %s", tmpfsDir, err) } if err := mount.Mount("tmpfs", tmpfsDir, "tmpfs", ""); err != nil { t.Fatalf("failed to create a tmpfs mount at %s - %s", tmpfsDir, err) } f, err := ioutil.TempFile(tmpfsDir, "touch-me") if err != nil { t.Fatal(err) } defer f.Close() runCmd := exec.Command(dockerBinary, "run", "--name", "test-data", "--volume", fmt.Sprintf("%s:/tmp:ro", tmpDir), "busybox:latest", "ls", "/tmp/tmpfs") out, stderr, exitCode, err := runCommandWithStdoutStderr(runCmd) if err != nil && exitCode != 0 { t.Fatal(out, stderr, err) } if !strings.Contains(out, filepath.Base(f.Name())) { t.Fatal("Recursive bind mount test failed. Expected file not found") } deleteAllContainers() logDone("run - volumes are bind mounted recuursively") }