diff --git a/drivers/overlay/overlay.go b/drivers/overlay/overlay.go index fc3f9d7e0e..c36f59dcf6 100644 --- a/drivers/overlay/overlay.go +++ b/drivers/overlay/overlay.go @@ -947,6 +947,15 @@ func (d *Driver) create(id, parent string, opts *graphdriver.CreateOpts, disable d.locker.Lock(id) defer d.locker.Unlock(id) + if _, err := system.Lstat(dir); err == nil { + logrus.Warnf("Trying to create a layer %#v while directory %q already exists; removing it first", id, dir) + // Don’t just os.RemoveAll(dir) here; removeLocked also removes the link in linkDir, + // so that we can’t end up with two symlinks in linkDir pointing to the same layer. + if err := d.removeLocked(id); err != nil { + return errors.Wrapf(err, "removing a pre-existing layer directory %q", dir) + } + } + if err := idtools.MkdirAllAndChownNew(dir, 0700, idPair); err != nil { return err } @@ -1183,6 +1192,10 @@ func (d *Driver) Remove(id string) error { d.locker.Lock(id) defer d.locker.Unlock(id) + return d.removeLocked(id) +} + +func (d *Driver) removeLocked(id string) error { dir := d.dir(id) lid, err := ioutil.ReadFile(path.Join(dir, "link")) if err == nil {