github.com/jiasir/docker@v1.3.3-0.20170609024000-252e610103e7/daemon/daemon_linux.go (about) 1 package daemon 2 3 import ( 4 "bufio" 5 "fmt" 6 "io" 7 "os" 8 "regexp" 9 "strings" 10 11 "github.com/Sirupsen/logrus" 12 "github.com/docker/docker/pkg/mount" 13 ) 14 15 // On Linux, plugins use a static path for storing execution state, 16 // instead of deriving path from daemon's exec-root. This is because 17 // plugin socket files are created here and they cannot exceed max 18 // path length of 108 bytes. 19 func getPluginExecRoot(root string) string { 20 return "/run/docker/plugins" 21 } 22 23 func (daemon *Daemon) cleanupMountsByID(id string) error { 24 logrus.Debugf("Cleaning up old mountid %s: start.", id) 25 f, err := os.Open("/proc/self/mountinfo") 26 if err != nil { 27 return err 28 } 29 defer f.Close() 30 31 return daemon.cleanupMountsFromReaderByID(f, id, mount.Unmount) 32 } 33 34 func (daemon *Daemon) cleanupMountsFromReaderByID(reader io.Reader, id string, unmount func(target string) error) error { 35 if daemon.root == "" { 36 return nil 37 } 38 var errors []string 39 40 regexps := getCleanPatterns(id) 41 sc := bufio.NewScanner(reader) 42 for sc.Scan() { 43 if fields := strings.Fields(sc.Text()); len(fields) >= 4 { 44 if mnt := fields[4]; strings.HasPrefix(mnt, daemon.root) { 45 for _, p := range regexps { 46 if p.MatchString(mnt) { 47 if err := unmount(mnt); err != nil { 48 logrus.Error(err) 49 errors = append(errors, err.Error()) 50 } 51 } 52 } 53 } 54 } 55 } 56 57 if err := sc.Err(); err != nil { 58 return err 59 } 60 61 if len(errors) > 0 { 62 return fmt.Errorf("Error cleaning up mounts:\n%v", strings.Join(errors, "\n")) 63 } 64 65 logrus.Debugf("Cleaning up old mountid %v: done.", id) 66 return nil 67 } 68 69 // cleanupMounts umounts shm/mqueue mounts for old containers 70 func (daemon *Daemon) cleanupMounts() error { 71 return daemon.cleanupMountsByID("") 72 } 73 74 func getCleanPatterns(id string) (regexps []*regexp.Regexp) { 75 var patterns []string 76 if id == "" { 77 id = "[0-9a-f]{64}" 78 patterns = append(patterns, "containers/"+id+"/shm") 79 } 80 patterns = append(patterns, "aufs/mnt/"+id+"$", "overlay/"+id+"/merged$", "zfs/graph/"+id+"$") 81 for _, p := range patterns { 82 r, err := regexp.Compile(p) 83 if err == nil { 84 regexps = append(regexps, r) 85 } 86 } 87 return 88 }