github.com/tompao/docker@v1.9.1/daemon/daemon_linux.go (about) 1 package daemon 2 3 import ( 4 "bufio" 5 "fmt" 6 "io" 7 "os" 8 "path/filepath" 9 "strings" 10 11 "github.com/Sirupsen/logrus" 12 "github.com/docker/docker/pkg/mount" 13 ) 14 15 // cleanupMounts umounts shm/mqueue mounts for old containers 16 func (daemon *Daemon) cleanupMounts() error { 17 logrus.Debugf("Cleaning up old shm/mqueue mounts: start.") 18 f, err := os.Open("/proc/self/mountinfo") 19 if err != nil { 20 return err 21 } 22 defer f.Close() 23 24 return daemon.cleanupMountsFromReader(f, mount.Unmount) 25 } 26 27 func (daemon *Daemon) cleanupMountsFromReader(reader io.Reader, unmount func(target string) error) error { 28 if daemon.repository == "" { 29 return nil 30 } 31 sc := bufio.NewScanner(reader) 32 var errors []string 33 for sc.Scan() { 34 line := sc.Text() 35 fields := strings.Fields(line) 36 if strings.HasPrefix(fields[4], daemon.repository) { 37 logrus.Debugf("Mount base: %v, repository %s", fields[4], daemon.repository) 38 mnt := fields[4] 39 mountBase := filepath.Base(mnt) 40 if mountBase == "mqueue" || mountBase == "shm" { 41 logrus.Debugf("Unmounting %v", mnt) 42 if err := unmount(mnt); err != nil { 43 logrus.Error(err) 44 errors = append(errors, err.Error()) 45 } 46 } 47 } 48 } 49 50 if err := sc.Err(); err != nil { 51 return err 52 } 53 54 if len(errors) > 0 { 55 return fmt.Errorf("Error cleaningup mounts:\n%v", strings.Join(errors, "\n")) 56 } 57 58 logrus.Debugf("Cleaning up old shm/mqueue mounts: done.") 59 return nil 60 }