diff --git a/daemon/daemon.go b/daemon/daemon.go index 59bff4013f..7f84de7c4f 100644 --- a/daemon/daemon.go +++ b/daemon/daemon.go @@ -736,11 +736,6 @@ func NewDaemon(config *Config, registryService *registry.Service) (daemon *Daemo return nil, err } - // Migrate the container if it is aufs and aufs is enabled - if err := migrateIfDownlevel(d.driver, config.Root); err != nil { - return nil, err - } - imageRoot := filepath.Join(config.Root, "image", d.driver.String()) fms, err := layer.NewFSMetadataStore(filepath.Join(imageRoot, "layerdb")) if err != nil { diff --git a/daemon/daemon_aufs.go b/daemon/daemon_aufs.go index 0848ea920f..151d0b1bf1 100644 --- a/daemon/daemon_aufs.go +++ b/daemon/daemon_aufs.go @@ -3,19 +3,6 @@ package daemon import ( - "github.com/Sirupsen/logrus" - "github.com/docker/docker/daemon/graphdriver" - "github.com/docker/docker/daemon/graphdriver/aufs" + // register the aufs graphdriver + _ "github.com/docker/docker/daemon/graphdriver/aufs" ) - -// Given the graphdriver ad, if it is aufs, then migrate it. -// If aufs driver is not built, this func is a noop. -func migrateIfAufs(driver graphdriver.Driver, root string) error { - if ad, ok := driver.(*aufs.Driver); ok { - logrus.Debugf("Migrating existing containers") - if err := ad.Migrate(root, setupInitLayer); err != nil { - return err - } - } - return nil -} diff --git a/daemon/daemon_no_aufs.go b/daemon/daemon_no_aufs.go deleted file mode 100644 index a74f775336..0000000000 --- a/daemon/daemon_no_aufs.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build exclude_graphdriver_aufs,linux freebsd - -package daemon - -import ( - "github.com/docker/docker/daemon/graphdriver" -) - -func migrateIfAufs(driver graphdriver.Driver, root string) error { - return nil -} diff --git a/daemon/daemon_unix.go b/daemon/daemon_unix.go index f9782a183e..9552e9769c 100644 --- a/daemon/daemon_unix.go +++ b/daemon/daemon_unix.go @@ -420,11 +420,6 @@ func configureKernelSecuritySupport(config *Config, driverName string) error { return nil } -// MigrateIfDownlevel is a wrapper for AUFS migration for downlevel -func migrateIfDownlevel(driver graphdriver.Driver, root string) error { - return migrateIfAufs(driver, root) -} - func isBridgeNetworkDisabled(config *Config) bool { return config.Bridge.Iface == disableNetworkBridge } diff --git a/daemon/daemon_windows.go b/daemon/daemon_windows.go index 477509c3ba..0bf05841e0 100644 --- a/daemon/daemon_windows.go +++ b/daemon/daemon_windows.go @@ -113,10 +113,6 @@ func configureKernelSecuritySupport(config *Config, driverName string) error { return nil } -func migrateIfDownlevel(driver graphdriver.Driver, root string) error { - return nil -} - func isBridgeNetworkDisabled(config *Config) bool { return false } diff --git a/daemon/graphdriver/aufs/migrate.go b/daemon/graphdriver/aufs/migrate.go deleted file mode 100644 index b195bf3f88..0000000000 --- a/daemon/graphdriver/aufs/migrate.go +++ /dev/null @@ -1,203 +0,0 @@ -// +build linux - -package aufs - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "os" - "path" - - "github.com/docker/docker/pkg/idtools" -) - -type metadata struct { - ID string `json:"id"` - ParentID string `json:"parent,omitempty"` - Image string `json:"Image,omitempty"` - - parent *metadata -} - -func pathExists(pth string) bool { - if _, err := os.Stat(pth); err != nil { - return false - } - return true -} - -// Migrate existing images and containers from docker < 0.7.x -// -// The format pre 0.7 is for docker to store the metadata and filesystem -// content in the same directory. For the migration to work we need to move Image layer -// data from /var/lib/docker/graph//layers to the diff of the registered id. -// -// Next we need to migrate the container's rw layer to diff of the driver. After the -// contents are migrated we need to register the image and container ids with the -// driver. -// -// For the migration we try to move the folder containing the layer files, if that -// fails because the data is currently mounted we will fallback to creating a -// symlink. -func (a *Driver) Migrate(pth string, setupInit func(p string, rootUID, rootGID int) error) error { - if pathExists(path.Join(pth, "graph")) { - if err := a.migrateRepositories(pth); err != nil { - return err - } - if err := a.migrateImages(path.Join(pth, "graph")); err != nil { - return err - } - return a.migrateContainers(path.Join(pth, "containers"), setupInit) - } - return nil -} - -func (a *Driver) migrateRepositories(pth string) error { - name := path.Join(pth, "repositories") - if err := os.Rename(name, name+"-aufs"); err != nil && !os.IsNotExist(err) { - return err - } - return nil -} - -func (a *Driver) migrateContainers(pth string, setupInit func(p string, rootUID, rootGID int) error) error { - fis, err := ioutil.ReadDir(pth) - if err != nil { - return err - } - - rootUID, rootGID, err := idtools.GetRootUIDGID(a.uidMaps, a.gidMaps) - if err != nil { - return err - } - - for _, fi := range fis { - if id := fi.Name(); fi.IsDir() && pathExists(path.Join(pth, id, "rw")) { - if err := tryRelocate(path.Join(pth, id, "rw"), path.Join(a.rootPath(), "diff", id)); err != nil { - return err - } - - if !a.Exists(id) { - - metadata, err := loadMetadata(path.Join(pth, id, "config.json")) - if err != nil { - return err - } - - initID := fmt.Sprintf("%s-init", id) - if err := a.Create(initID, metadata.Image, ""); err != nil { - return err - } - - initPath, err := a.Get(initID, "") - if err != nil { - return err - } - // setup init layer - if err := setupInit(initPath, rootUID, rootGID); err != nil { - return err - } - - if err := a.Create(id, initID, ""); err != nil { - return err - } - } - } - } - return nil -} - -func (a *Driver) migrateImages(pth string) error { - fis, err := ioutil.ReadDir(pth) - if err != nil { - return err - } - var ( - m = make(map[string]*metadata) - current *metadata - exists bool - ) - - for _, fi := range fis { - if id := fi.Name(); fi.IsDir() && pathExists(path.Join(pth, id, "layer")) { - if current, exists = m[id]; !exists { - current, err = loadMetadata(path.Join(pth, id, "json")) - if err != nil { - return err - } - m[id] = current - } - } - } - - for _, v := range m { - v.parent = m[v.ParentID] - } - - migrated := make(map[string]bool) - for _, v := range m { - if err := a.migrateImage(v, pth, migrated); err != nil { - return err - } - } - return nil -} - -func (a *Driver) migrateImage(m *metadata, pth string, migrated map[string]bool) error { - if !migrated[m.ID] { - if m.parent != nil { - a.migrateImage(m.parent, pth, migrated) - } - if err := tryRelocate(path.Join(pth, m.ID, "layer"), path.Join(a.rootPath(), "diff", m.ID)); err != nil { - return err - } - if !a.Exists(m.ID) { - if err := a.Create(m.ID, m.ParentID, ""); err != nil { - return err - } - } - migrated[m.ID] = true - } - return nil -} - -// tryRelocate will try to rename the old path to the new pack and if -// the operation fails, it will fallback to a symlink -func tryRelocate(oldPath, newPath string) error { - s, err := os.Lstat(newPath) - if err != nil && !os.IsNotExist(err) { - return err - } - // If the destination is a symlink then we already tried to relocate once before - // and it failed so we delete it and try to remove - if s != nil && s.Mode()&os.ModeSymlink != 0 { - if err := os.RemoveAll(newPath); err != nil { - return err - } - } - if err := os.Rename(oldPath, newPath); err != nil { - if sErr := os.Symlink(oldPath, newPath); sErr != nil { - return fmt.Errorf("Unable to relocate %s to %s: Rename err %s Symlink err %s", oldPath, newPath, err, sErr) - } - } - return nil -} - -func loadMetadata(pth string) (*metadata, error) { - f, err := os.Open(pth) - if err != nil { - return nil, err - } - defer f.Close() - - var ( - out = &metadata{} - dec = json.NewDecoder(f) - ) - - if err := dec.Decode(out); err != nil { - return nil, err - } - return out, nil -}