diff --git a/runtime.go b/runtime.go index 70a4014cc..0a17bfd15 100644 --- a/runtime.go +++ b/runtime.go @@ -327,31 +327,48 @@ func (runtime *Runtime) restore() error { // Perform a migration for aufs containers if !deviceSet.HasDevice(container.ID) { - utils.Debugf("[migration] Begin migration of %s", container.ID) - - image, err := runtime.graph.Get(container.Image) + contents, err := ioutil.ReadDir(container.rwPath()) if err != nil { - utils.Debugf("[migratoin] Failed to get image %s", err) - continue - } - if err := image.Mount(runtime, container.RootfsPath(), container.rwPath(), container.ID); err != nil { - utils.Debugf("[migratoin] Failed to mount image %s", err) + if !os.IsNotExist(err) { + utils.Debugf("[migration] Error reading rw dir %s", err) + } continue } - if err := image.applyLayer(container.rwPath(), container.RootfsPath()); err != nil { - utils.Debugf("[migration] Failed to apply layer %s", err) - } + if len(contents) > 0 { + utils.Debugf("[migration] Begin migration of %s", container.ID) - if err := image.Unmount(runtime, container.RootfsPath(), container.ID); err != nil { - utils.Debugf("[migraton] Failed to unmount image %s", err) - } + image, err := runtime.graph.Get(container.Image) + if err != nil { + utils.Debugf("[migratoin] Failed to get image %s", err) + continue + } - if err := os.RemoveAll(container.rwPath()); err != nil { - utils.Debugf("[migration] Failed to remove rw dir %s", err) - } + unmount := func() { + if err := image.Unmount(runtime, container.RootfsPath(), container.ID); err != nil { + utils.Debugf("[migraton] Failed to unmount image %s", err) + } + } - utils.Debugf("[migration] End migration of %s", container.ID) + if err := image.Mount(runtime, container.RootfsPath(), container.rwPath(), container.ID); err != nil { + utils.Debugf("[migratoin] Failed to mount image %s", err) + continue + } + + if err := image.applyLayer(container.rwPath(), container.RootfsPath()); err != nil { + utils.Debugf("[migration] Failed to apply layer %s", err) + unmount() + continue + } + + unmount() + + if err := os.RemoveAll(container.rwPath()); err != nil { + utils.Debugf("[migration] Failed to remove rw dir %s", err) + } + + utils.Debugf("[migration] End migration of %s", container.ID) + } } if err := runtime.Register(container); err != nil {