diff --git a/integration-cli/docker_cli_rm_test.go b/integration-cli/docker_cli_rm_test.go new file mode 100644 index 0000000000000..5b35e8fa47d8e --- /dev/null +++ b/integration-cli/docker_cli_rm_test.go @@ -0,0 +1,27 @@ +package main + +import ( + "os" + "os/exec" + "testing" +) + +func TestRemoveContainerWithRemovedVolume(t *testing.T) { + cmd := exec.Command(dockerBinary, "run", "--name", "losemyvolumes", "-v", "/tmp/testing:/test", "busybox", "true") + if _, err := runCommand(cmd); err != nil { + t.Fatal(err) + } + + if err := os.Remove("/tmp/testing"); err != nil { + t.Fatal(err) + } + + cmd = exec.Command(dockerBinary, "rm", "-v", "losemyvolumes") + if _, err := runCommand(cmd); err != nil { + t.Fatal(err) + } + + deleteAllContainers() + + logDone("rm - removed volume") +} diff --git a/server/server.go b/server/server.go index 6fd36c2d8d63f..fdd674b2f4c7b 100644 --- a/server/server.go +++ b/server/server.go @@ -1877,13 +1877,16 @@ func (srv *Server) ContainerDestroy(job *engine.Job) engine.Status { for _, bind := range container.HostConfig().Binds { source := strings.Split(bind, ":")[0] // TODO: refactor all volume stuff, all of it - // this is very important that we eval the link - // or comparing the keys to container.Volumes will not work + // it is very important that we eval the link or comparing the keys to container.Volumes will not work + // + // eval symlink can fail, ref #5244 if we receive an is not exist error we can ignore it p, err := filepath.EvalSymlinks(source) - if err != nil { + if err != nil && !os.IsNotExist(err) { return job.Error(err) } - source = p + if p != "" { + source = p + } binds[source] = struct{}{} }