Merge pull request #47567 from thaJeztah/move_rootless_mountopts
daemon: move getUnprivilegedMountFlags to internal package
This commit is contained in:
commit
979f03f9f6
2 changed files with 41 additions and 34 deletions
|
@ -19,6 +19,7 @@ import (
|
||||||
"github.com/docker/docker/container"
|
"github.com/docker/docker/container"
|
||||||
dconfig "github.com/docker/docker/daemon/config"
|
dconfig "github.com/docker/docker/daemon/config"
|
||||||
"github.com/docker/docker/errdefs"
|
"github.com/docker/docker/errdefs"
|
||||||
|
"github.com/docker/docker/internal/rootless/mountopts"
|
||||||
"github.com/docker/docker/oci"
|
"github.com/docker/docker/oci"
|
||||||
"github.com/docker/docker/oci/caps"
|
"github.com/docker/docker/oci/caps"
|
||||||
"github.com/docker/docker/pkg/idtools"
|
"github.com/docker/docker/pkg/idtools"
|
||||||
|
@ -30,7 +31,6 @@ import (
|
||||||
"github.com/opencontainers/runc/libcontainer/cgroups"
|
"github.com/opencontainers/runc/libcontainer/cgroups"
|
||||||
specs "github.com/opencontainers/runtime-spec/specs-go"
|
specs "github.com/opencontainers/runtime-spec/specs-go"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"golang.org/x/sys/unix"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const inContainerInitPath = "/sbin/" + dconfig.DefaultInitBinary
|
const inContainerInitPath = "/sbin/" + dconfig.DefaultInitBinary
|
||||||
|
@ -445,38 +445,6 @@ func ensureSharedOrSlave(path string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the set of mount flags that are set on the mount that contains the given
|
|
||||||
// path and are locked by CL_UNPRIVILEGED. This is necessary to ensure that
|
|
||||||
// bind-mounting "with options" will not fail with user namespaces, due to
|
|
||||||
// kernel restrictions that require user namespace mounts to preserve
|
|
||||||
// CL_UNPRIVILEGED locked flags.
|
|
||||||
func getUnprivilegedMountFlags(path string) ([]string, error) {
|
|
||||||
var statfs unix.Statfs_t
|
|
||||||
if err := unix.Statfs(path, &statfs); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// The set of keys come from https://github.com/torvalds/linux/blob/v4.13/fs/namespace.c#L1034-L1048.
|
|
||||||
unprivilegedFlags := map[uint64]string{
|
|
||||||
unix.MS_RDONLY: "ro",
|
|
||||||
unix.MS_NODEV: "nodev",
|
|
||||||
unix.MS_NOEXEC: "noexec",
|
|
||||||
unix.MS_NOSUID: "nosuid",
|
|
||||||
unix.MS_NOATIME: "noatime",
|
|
||||||
unix.MS_RELATIME: "relatime",
|
|
||||||
unix.MS_NODIRATIME: "nodiratime",
|
|
||||||
}
|
|
||||||
|
|
||||||
var flags []string
|
|
||||||
for mask, flag := range unprivilegedFlags {
|
|
||||||
if uint64(statfs.Flags)&mask == mask {
|
|
||||||
flags = append(flags, flag)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return flags, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
var (
|
||||||
mountPropagationMap = map[string]int{
|
mountPropagationMap = map[string]int{
|
||||||
"private": mount.PRIVATE,
|
"private": mount.PRIVATE,
|
||||||
|
@ -661,7 +629,7 @@ func withMounts(daemon *Daemon, daemonCfg *configStore, c *container.Container,
|
||||||
// when runc sets up the root filesystem, it is already inside a user
|
// when runc sets up the root filesystem, it is already inside a user
|
||||||
// namespace, and thus cannot change any flags that are locked.
|
// namespace, and thus cannot change any flags that are locked.
|
||||||
if daemonCfg.RemappedRoot != "" || userns.RunningInUserNS() {
|
if daemonCfg.RemappedRoot != "" || userns.RunningInUserNS() {
|
||||||
unprivOpts, err := getUnprivilegedMountFlags(m.Source)
|
unprivOpts, err := mountopts.UnprivilegedMountFlags(m.Source)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
39
internal/rootless/mountopts/mountopts_linux.go
Normal file
39
internal/rootless/mountopts/mountopts_linux.go
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
package mountopts
|
||||||
|
|
||||||
|
import (
|
||||||
|
"golang.org/x/sys/unix"
|
||||||
|
)
|
||||||
|
|
||||||
|
// UnprivilegedMountFlags gets the set of mount flags that are set on the mount that contains the given
|
||||||
|
// path and are locked by CL_UNPRIVILEGED. This is necessary to ensure that
|
||||||
|
// bind-mounting "with options" will not fail with user namespaces, due to
|
||||||
|
// kernel restrictions that require user namespace mounts to preserve
|
||||||
|
// CL_UNPRIVILEGED locked flags.
|
||||||
|
//
|
||||||
|
// TODO: Move to github.com/moby/sys/mount, and update BuildKit copy of this code as well (https://github.com/moby/buildkit/blob/v0.13.0/util/rootless/mountopts/mountopts_linux.go#L11-L18)
|
||||||
|
func UnprivilegedMountFlags(path string) ([]string, error) {
|
||||||
|
var statfs unix.Statfs_t
|
||||||
|
if err := unix.Statfs(path, &statfs); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// The set of keys come from https://github.com/torvalds/linux/blob/v4.13/fs/namespace.c#L1034-L1048.
|
||||||
|
unprivilegedFlags := map[uint64]string{
|
||||||
|
unix.MS_RDONLY: "ro",
|
||||||
|
unix.MS_NODEV: "nodev",
|
||||||
|
unix.MS_NOEXEC: "noexec",
|
||||||
|
unix.MS_NOSUID: "nosuid",
|
||||||
|
unix.MS_NOATIME: "noatime",
|
||||||
|
unix.MS_RELATIME: "relatime",
|
||||||
|
unix.MS_NODIRATIME: "nodiratime",
|
||||||
|
}
|
||||||
|
|
||||||
|
var flags []string
|
||||||
|
for mask, flag := range unprivilegedFlags {
|
||||||
|
if uint64(statfs.Flags)&mask == mask {
|
||||||
|
flags = append(flags, flag)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return flags, nil
|
||||||
|
}
|
Loading…
Reference in a new issue