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  }