浏览代码

Merge pull request #5246 from crosbymichael/fix-mount

Fix unmount when host volume is removed
Victor Vieux 11 年之前
父节点
当前提交
925dfdb18a
共有 2 个文件被更改,包括 34 次插入4 次删除
  1. 27 0
      integration-cli/docker_cli_rm_test.go
  2. 7 4
      server/server.go

+ 27 - 0
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")
+}

+ 7 - 4
server/server.go

@@ -1877,13 +1877,16 @@ func (srv *Server) ContainerDestroy(job *engine.Job) engine.Status {
 			for _, bind := range container.HostConfig().Binds {
 			for _, bind := range container.HostConfig().Binds {
 				source := strings.Split(bind, ":")[0]
 				source := strings.Split(bind, ":")[0]
 				// TODO: refactor all volume stuff, all of it
 				// 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)
 				p, err := filepath.EvalSymlinks(source)
-				if err != nil {
+				if err != nil && !os.IsNotExist(err) {
 					return job.Error(err)
 					return job.Error(err)
 				}
 				}
-				source = p
+				if p != "" {
+					source = p
+				}
 				binds[source] = struct{}{}
 				binds[source] = struct{}{}
 			}
 			}