Kaynağa Gözat

Merge pull request #13325 from LK4D4/cleanup_mounts

Fix Put without Get in overlay
Jessie Frazelle 10 yıl önce
ebeveyn
işleme
d29dc0b608

+ 8 - 0
daemon/graphdriver/overlay/overlay.go

@@ -318,6 +318,14 @@ func (d *Driver) Put(id string) error {
 	mount := d.active[id]
 	if mount == nil {
 		logrus.Debugf("Put on a non-mounted device %s", id)
+		// but it might be still here
+		if d.Exists(id) {
+			mergedDir := path.Join(d.dir(id), "merged")
+			err := syscall.Unmount(mergedDir, 0)
+			if err != nil {
+				logrus.Debugf("Failed to unmount %s overlay: %v", id, err)
+			}
+		}
 		return nil
 	}
 

+ 14 - 1
integration-cli/docker_cli_daemon_test.go

@@ -1233,7 +1233,7 @@ func pingContainers(c *check.C, d *Daemon, expectFailure bool) {
 	runCommand(exec.Command(dockerBinary, args...))
 }
 
-func (s *DockerDaemonSuite) TestDaemonRestartWithSockerAsVolume(c *check.C) {
+func (s *DockerDaemonSuite) TestDaemonRestartWithSocketAsVolume(c *check.C) {
 	c.Assert(s.d.StartWithBusybox(), check.IsNil)
 
 	socket := filepath.Join(s.d.folder, "docker.sock")
@@ -1242,3 +1242,16 @@ func (s *DockerDaemonSuite) TestDaemonRestartWithSockerAsVolume(c *check.C) {
 	c.Assert(err, check.IsNil, check.Commentf("Output: %s", out))
 	c.Assert(s.d.Restart(), check.IsNil)
 }
+
+func (s *DockerDaemonSuite) TestCleanupMountsAfterCrash(c *check.C) {
+	c.Assert(s.d.StartWithBusybox(), check.IsNil)
+
+	out, err := s.d.Cmd("run", "-d", "busybox", "top")
+	c.Assert(err, check.IsNil, check.Commentf("Output: %s", out))
+	id := strings.TrimSpace(out)
+	c.Assert(s.d.cmd.Process.Signal(os.Kill), check.IsNil)
+	c.Assert(s.d.Start(), check.IsNil)
+	mountOut, err := exec.Command("mount").CombinedOutput()
+	c.Assert(err, check.IsNil, check.Commentf("Output: %s", mountOut))
+	c.Assert(strings.Contains(string(mountOut), id), check.Equals, false, check.Commentf("Something mounted from older daemon start: %s", mountOut))
+}