github.com/jen20/docker@v1.13.1/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  func (daemon *Daemon) cleanupMountsByID(id string) error {
    16  	logrus.Debugf("Cleaning up old mountid %s: start.", id)
    17  	f, err := os.Open("/proc/self/mountinfo")
    18  	if err != nil {
    19  		return err
    20  	}
    21  	defer f.Close()
    22  
    23  	return daemon.cleanupMountsFromReaderByID(f, id, mount.Unmount)
    24  }
    25  
    26  func (daemon *Daemon) cleanupMountsFromReaderByID(reader io.Reader, id string, unmount func(target string) error) error {
    27  	if daemon.root == "" {
    28  		return nil
    29  	}
    30  	var errors []string
    31  
    32  	regexps := getCleanPatterns(id)
    33  	sc := bufio.NewScanner(reader)
    34  	for sc.Scan() {
    35  		if fields := strings.Fields(sc.Text()); len(fields) >= 4 {
    36  			if mnt := fields[4]; strings.HasPrefix(mnt, daemon.root) {
    37  				for _, p := range regexps {
    38  					if p.MatchString(mnt) {
    39  						if err := unmount(mnt); err != nil {
    40  							logrus.Error(err)
    41  							errors = append(errors, err.Error())
    42  						}
    43  					}
    44  				}
    45  			}
    46  		}
    47  	}
    48  
    49  	if err := sc.Err(); err != nil {
    50  		return err
    51  	}
    52  
    53  	if len(errors) > 0 {
    54  		return fmt.Errorf("Error cleaning up mounts:\n%v", strings.Join(errors, "\n"))
    55  	}
    56  
    57  	logrus.Debugf("Cleaning up old mountid %v: done.", id)
    58  	return nil
    59  }
    60  
    61  // cleanupMounts umounts shm/mqueue mounts for old containers
    62  func (daemon *Daemon) cleanupMounts() error {
    63  	return daemon.cleanupMountsByID("")
    64  }
    65  
    66  func getCleanPatterns(id string) (regexps []*regexp.Regexp) {
    67  	var patterns []string
    68  	if id == "" {
    69  		id = "[0-9a-f]{64}"
    70  		patterns = append(patterns, "containers/"+id+"/shm")
    71  	}
    72  	patterns = append(patterns, "aufs/mnt/"+id+"$", "overlay/"+id+"/merged$", "zfs/graph/"+id+"$")
    73  	for _, p := range patterns {
    74  		r, err := regexp.Compile(p)
    75  		if err == nil {
    76  			regexps = append(regexps, r)
    77  		}
    78  	}
    79  	return
    80  }