Prepend the rootfs mounts to the user specified runtime.mounts.

User specified mounts should be able to rely on the rootfs being mounted, in
particular for a writeable container they should expect the writeable overlay
to already be in place.

Signed-off-by: Ian Campbell <ijc@docker.com>
This commit is contained in:
Ian Campbell 2018-01-11 11:33:53 +00:00
parent 1aca4eefa5
commit 0a6d69d2d3

View File

@ -229,6 +229,7 @@ func ImageBundle(prefix string, ref *reference.Spec, config []byte, runtime Runt
return err return err
} }
var rootfsMounts []specs.Mount
if !readonly { if !readonly {
// add a tmp directory to be used as a mount point for tmpfs for upper, work // add a tmp directory to be used as a mount point for tmpfs for upper, work
tmp := path.Join(prefix, "tmp") tmp := path.Join(prefix, "tmp")
@ -250,13 +251,12 @@ func ImageBundle(prefix string, ref *reference.Spec, config []byte, runtime Runt
return err return err
} }
overlayOptions := []string{"lowerdir=/" + root, "upperdir=/" + path.Join(tmp, "upper"), "workdir=/" + path.Join(tmp, "work")} overlayOptions := []string{"lowerdir=/" + root, "upperdir=/" + path.Join(tmp, "upper"), "workdir=/" + path.Join(tmp, "work")}
runtimeMounts := append(*runtime.Mounts, rootfsMounts = []specs.Mount{
specs.Mount{Source: "tmpfs", Type: "tmpfs", Destination: "/" + tmp}, {Source: "tmpfs", Type: "tmpfs", Destination: "/" + tmp},
// remount private as nothing else should see the temporary layers // remount private as nothing else should see the temporary layers
specs.Mount{Destination: "/" + tmp, Options: []string{"remount", "private"}}, {Destination: "/" + tmp, Options: []string{"remount", "private"}},
specs.Mount{Source: "overlay", Type: "overlay", Destination: "/" + path.Join(prefix, "rootfs"), Options: overlayOptions}, {Source: "overlay", Type: "overlay", Destination: "/" + path.Join(prefix, "rootfs"), Options: overlayOptions},
) }
runtime.Mounts = &runtimeMounts
} else { } else {
if foundElsewhere { if foundElsewhere {
// we need to make the mountpoint at rootfs // we need to make the mountpoint at rootfs
@ -270,10 +270,15 @@ func ImageBundle(prefix string, ref *reference.Spec, config []byte, runtime Runt
} }
} }
// either bind from another location, or bind from self to make sure it is a mountpoint as runc prefers this // either bind from another location, or bind from self to make sure it is a mountpoint as runc prefers this
runtimeMounts := append(*runtime.Mounts, specs.Mount{Source: "/" + root, Destination: "/" + path.Join(prefix, "rootfs"), Options: []string{"bind"}}) rootfsMounts = []specs.Mount{
runtime.Mounts = &runtimeMounts {Source: "/" + root, Destination: "/" + path.Join(prefix, "rootfs"), Options: []string{"bind"}},
}
} }
// Prepend the rootfs onto the user specified mounts.
runtimeMounts := append(rootfsMounts, *runtime.Mounts...)
runtime.Mounts = &runtimeMounts
// write the runtime config // write the runtime config
runtimeConfig, err := json.MarshalIndent(runtime, "", " ") runtimeConfig, err := json.MarshalIndent(runtime, "", " ")
if err != nil { if err != nil {