diff --git a/integration-cli/docker_api_containers_test.go b/integration-cli/docker_api_containers_test.go index 5dce388381..ad995b73fb 100644 --- a/integration-cli/docker_api_containers_test.go +++ b/integration-cli/docker_api_containers_test.go @@ -162,6 +162,43 @@ func TestContainerApiStartVolumeBinds(t *testing.T) { logDone("container REST API - check volume binds on start") } +// Test for GH#10618 +func TestContainerApiStartDupVolumeBinds(t *testing.T) { + defer deleteAllContainers() + name := "testdups" + config := map[string]interface{}{ + "Image": "busybox", + "Volumes": map[string]struct{}{"/tmp": {}}, + } + + if _, err := sockRequest("POST", "/containers/create?name="+name, config); err != nil && !strings.Contains(err.Error(), "201 Created") { + t.Fatal(err) + } + + bindPath1, err := ioutil.TempDir("", "test1") + if err != nil { + t.Fatal(err) + } + defer os.Remove(bindPath1) + bindPath2, err := ioutil.TempDir("", "test2") + if err != nil { + t.Fatal(err) + } + defer os.Remove(bindPath2) + + config = map[string]interface{}{ + "Binds": []string{bindPath1 + ":/tmp", bindPath2 + ":/tmp"}, + } + if body, err := sockRequest("POST", "/containers/"+name+"/start", config); err == nil { + t.Fatal("expected container start to fail when duplicate volume binds to same container path") + } else { + if !strings.Contains(string(body), "Duplicate volume") { + t.Fatalf("Expected failure due to duplicate bind mounts to same path, instead got: %q with error: %v", string(body), err) + } + } + + logDone("container REST API - check for duplicate volume binds error on start") +} func TestContainerApiStartVolumesFrom(t *testing.T) { defer deleteAllContainers() volName := "voltst" diff --git a/integration-cli/docker_cli_run_test.go b/integration-cli/docker_cli_run_test.go index c66ea27450..a61b348a1d 100644 --- a/integration-cli/docker_cli_run_test.go +++ b/integration-cli/docker_cli_run_test.go @@ -495,7 +495,23 @@ func TestVolumesFromGetsProperMode(t *testing.T) { // Test for GH#10618 func TestRunNoDupVolumes(t *testing.T) { - cmd := exec.Command(dockerBinary, "run", "-v", "/etc:/someplace", "-v", "/usr/lib:/someplace", "busybox", "echo", "hi") + + bindPath1, err := ioutil.TempDir("", "test1") + if err != nil { + t.Fatal(err) + } + defer os.Remove(bindPath1) + + bindPath2, err := ioutil.TempDir("", "test2") + if err != nil { + t.Fatal(err) + } + defer os.Remove(bindPath2) + + mountstr1 := bindPath1 + ":/someplace" + mountstr2 := bindPath2 + ":/someplace" + + cmd := exec.Command(dockerBinary, "run", "-v", mountstr1, "-v", mountstr2, "busybox", "true") if out, _, err := runCommandWithOutput(cmd); err == nil { t.Fatal("Expected error about duplicate volume definitions") } else {