func cleanDockerGraph(graphDir string, v versionutil.Version) error { logrus.Debugf("Cleaning for version %s", v) // Handle migration files migratedVersion := versionutil.StaticVersion(1, 10, 0) migratedVersion.Tag = "dev" if v.LessThan(migratedVersion) { if err := removeIfExists(filepath.Join(graphDir, ".migration-v1-images.json")); err != nil { return err } if err := removeIfExists(filepath.Join(graphDir, ".migration-v1-tags")); err != nil { return err } root := filepath.Join(graphDir, "graph") migrationPurger := func(path string, info os.FileInfo, err error) error { if err != nil { return err } if !info.IsDir() { if strings.HasPrefix(filepath.Base(path), ".migrat") { logrus.Debugf("Removing migration file %s", path) if err := os.Remove(path); err != nil { return err } } } return nil } if err := filepath.Walk(root, migrationPurger); err != nil { return err } // Remove all containers infos, err := ioutil.ReadDir(filepath.Join(graphDir, "containers")) if err != nil { if os.IsNotExist(err) { return nil } return err } drivers, err := getAllGraphDrivers(graphDir) if err != nil { return err } for _, info := range infos { container := info.Name() for _, graphDriver := range drivers { if err := removeLayerGraphContent(container, "mount-id", graphDriver, graphDir); err != nil && !os.IsNotExist(err) { return err } if err := removeLayerGraphContent(container, "init-id", graphDriver, graphDir); err != nil && !os.IsNotExist(err) { return err } } if err := os.RemoveAll(filepath.Join(graphDir, "containers", container)); err != nil { return err } } if err := os.RemoveAll(filepath.Join(graphDir, "image")); err != nil { return err } if err := removeIfExists(filepath.Join(graphDir, "linkgraph.db")); err != nil { return err } // TODO: Remove everything in graph driver directory which is not in graph } return nil }