diff --git a/integration/commands_test.go b/integration/commands_test.go index af720f67e6..bcf79c1534 100644 --- a/integration/commands_test.go +++ b/integration/commands_test.go @@ -968,3 +968,66 @@ func TestRunCidFile(t *testing.T) { }) } + +func TestContainerOrphaning(t *testing.T) { + + // setup a temporary directory + tmpDir, err := ioutil.TempDir("", "project") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tmpDir) + + // setup a CLI and server + cli := docker.NewDockerCli(nil, os.Stdout, ioutil.Discard, testDaemonProto, testDaemonAddr) + defer cleanup(globalEngine, t) + srv := mkServerFromEngine(globalEngine, t) + + // closure to build something + buildSomething := func(template string, image string) string { + dockerfile := path.Join(tmpDir, "Dockerfile") + replacer := strings.NewReplacer("{IMAGE}", unitTestImageID) + contents := replacer.Replace(template) + ioutil.WriteFile(dockerfile, []byte(contents), 0x777) + if err := cli.CmdBuild("-t", image, tmpDir); err != nil { + t.Fatal(err) + } + img, err := srv.ImageInspect(image) + if err != nil { + t.Fatal(err) + } + return img.ID + } + + // build an image + imageName := "orphan-test" + template1 := ` + from {IMAGE} + cmd ["/bin/echo", "holla"] + ` + img1 := buildSomething(template1, imageName) + + // create a container using the fist image + if err := cli.CmdRun(imageName); err != nil { + t.Fatal(err) + } + + // build a new image that splits lineage + template2 := ` + from {IMAGE} + cmd ["/bin/echo", "holla"] + expose 22 + ` + buildSomething(template2, imageName) + + // remove the second image by name + resp, err := srv.ImageDelete(imageName, true) + + // see if we deleted the first image (and orphaned the container) + for _, i := range resp { + if img1 == i.Deleted { + t.Fatal("Orphaned image with container") + } + } + +}