Skip to content

Commit

Permalink
Use absolute path for rootfs in OCI config.json
Browse files Browse the repository at this point in the history
This avoid an extra bind mount within /var/run/docker/libcontainerd

This should resolve situations where a container having the host
/var/run bound prevents other containers from being cleanly removed
(e.g. moby#21969).

Signed-off-by: Kenfe-Mickael Laventure <mickael.laventure@gmail.com>
  • Loading branch information
mlaventure committed Apr 22, 2016
1 parent 9b00817 commit 3135874
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 19 deletions.
36 changes: 18 additions & 18 deletions libcontainerd/client_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -163,15 +163,9 @@ func (clnt *client) Create(containerID string, spec Spec, options ...CreateOptio
}
}()

// uid/gid
rootfsDir := filepath.Join(container.dir, "rootfs")
if err := idtools.MkdirAllAs(rootfsDir, 0700, uid, gid); err != nil && !os.IsExist(err) {
if err := idtools.MkdirAllAs(container.dir, 0700, uid, gid); err != nil && !os.IsExist(err) {
return err
}
if err := syscall.Mount(spec.Root.Path, rootfsDir, "bind", syscall.MS_REC|syscall.MS_BIND, ""); err != nil {
return err
}
spec.Root.Path = "rootfs"

f, err := os.Create(filepath.Join(container.dir, configFilename))
if err != nil {
Expand Down Expand Up @@ -258,6 +252,22 @@ func (clnt *client) Stats(containerID string) (*Stats, error) {
return (*Stats)(resp), nil
}

// Take care of the old 1.11.0 behavior in case the version upgrade
// happenned without a clean daemon shutdown
func (clnt *client) cleanupOldRootfs(containerID string) {
// Unmount and delete the bundle folder
if mts, err := mount.GetMounts(); err == nil {
for _, mts := range mts {
if strings.HasSuffix(mts.Mountpoint, containerID+"/rootfs") {
if err := syscall.Unmount(mts.Mountpoint, syscall.MNT_DETACH); err == nil {
os.RemoveAll(strings.TrimSuffix(mts.Mountpoint, "/rootfs"))
}
break
}
}
}
}

func (clnt *client) setExited(containerID string) error {
clnt.lock(containerID)
defer clnt.unlock(containerID)
Expand All @@ -274,17 +284,7 @@ func (clnt *client) setExited(containerID string) error {
ExitCode: exitCode,
}})

// Unmount and delete the bundle folder
if mts, err := mount.GetMounts(); err == nil {
for _, mts := range mts {
if strings.HasSuffix(mts.Mountpoint, containerID+"/rootfs") {
if err := syscall.Unmount(mts.Mountpoint, syscall.MNT_DETACH); err == nil {
os.RemoveAll(strings.TrimSuffix(mts.Mountpoint, "/rootfs"))
}
break
}
}
}
clnt.cleanupOldRootfs(containerID)

return err
}
Expand Down
1 change: 0 additions & 1 deletion libcontainerd/container_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ func (ctr *container) clean() error {
return err
}

syscall.Unmount(filepath.Join(ctr.dir, "rootfs"), syscall.MNT_DETACH) // ignore error
if err := os.RemoveAll(ctr.dir); err != nil {
return err
}
Expand Down

0 comments on commit 3135874

Please sign in to comment.