diff --git a/hack/make.sh b/hack/make.sh index a5d66e367..0dd07bfec 100755 --- a/hack/make.sh +++ b/hack/make.sh @@ -45,7 +45,7 @@ fi # Use these flags when compiling the tests and final binary LDFLAGS='-X main.GITCOMMIT "'$GITCOMMIT'" -X main.VERSION "'$VERSION'" -w -linkmode external -extldflags "-lpthread -static -Wl,--unresolved-symbols=ignore-all"' -BUILDFLAGS='-tags netgo' +BUILDFLAGS='-tags netgo -a' bundle() { diff --git a/runtime.go b/runtime.go index ba2dc9fcc..0a17bfd15 100644 --- a/runtime.go +++ b/runtime.go @@ -321,7 +321,56 @@ func (runtime *Runtime) restore() error { } return len(ic.Links) < len(jc.Links) }) + + deviceSet := runtime.config.DeviceSet for _, container := range containers { + + // Perform a migration for aufs containers + if !deviceSet.HasDevice(container.ID) { + contents, err := ioutil.ReadDir(container.rwPath()) + if err != nil { + if !os.IsNotExist(err) { + utils.Debugf("[migration] Error reading rw dir %s", err) + } + continue + } + + if len(contents) > 0 { + utils.Debugf("[migration] Begin migration of %s", container.ID) + + image, err := runtime.graph.Get(container.Image) + if err != nil { + utils.Debugf("[migratoin] Failed to get image %s", err) + continue + } + + unmount := func() { + if err := image.Unmount(runtime, container.RootfsPath(), container.ID); err != nil { + utils.Debugf("[migraton] Failed to unmount image %s", err) + } + } + + 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 { utils.Debugf("Failed to register container %s: %s", container.ID, err) continue