daemon_linux.go 1.8 KB

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