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>
(cherry picked from commit 3135874)
  • Loading branch information
mlaventure committed Apr 25, 2016
1 parent f503494 commit dc98419
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 @@ -273,17 +283,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 @@ -33,7 +33,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 dc98419

Please sign in to comment.