dotcloud/docker

View on GitHub
oci/defaults.go

Summary

Maintainability
B
4 hrs
Test Coverage
package oci // import "github.com/docker/docker/oci"

import (
    "runtime"

    "github.com/docker/docker/oci/caps"
    specs "github.com/opencontainers/runtime-spec/specs-go"
)

func iPtr(i int64) *int64 { return &i }

const defaultUnixPathEnv = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

// DefaultPathEnv is unix style list of directories to search for
// executables. Each directory is separated from the next by a colon
// ':' character .
// For Windows containers, an empty string is returned as the default
// path will be set by the container, and Docker has no context of what the
// default path should be.
//
// TODO(thaJeztah) align Windows default with BuildKit; see https://github.com/moby/buildkit/pull/1747
// TODO(thaJeztah) use defaults from containerd (but align it with BuildKit; see https://github.com/moby/buildkit/pull/1747)
func DefaultPathEnv(os string) string {
    if os == "windows" {
        return ""
    }
    return defaultUnixPathEnv
}

// DefaultSpec returns the default spec used by docker for the current Platform
func DefaultSpec() specs.Spec {
    if runtime.GOOS == "windows" {
        return DefaultWindowsSpec()
    }
    return DefaultLinuxSpec()
}

// DefaultWindowsSpec create a default spec for running Windows containers
func DefaultWindowsSpec() specs.Spec {
    return specs.Spec{
        Version: specs.Version,
        Windows: &specs.Windows{},
        Process: &specs.Process{},
        Root:    &specs.Root{},
    }
}

// DefaultLinuxSpec create a default spec for running Linux containers
func DefaultLinuxSpec() specs.Spec {
    return specs.Spec{
        Version: specs.Version,
        Process: &specs.Process{
            Capabilities: &specs.LinuxCapabilities{
                Bounding:  caps.DefaultCapabilities(),
                Permitted: caps.DefaultCapabilities(),
                Effective: caps.DefaultCapabilities(),
            },
        },
        Root: &specs.Root{},
        Mounts: []specs.Mount{
            {
                Destination: "/proc",
                Type:        "proc",
                Source:      "proc",
                Options:     []string{"nosuid", "noexec", "nodev"},
            },
            {
                Destination: "/dev",
                Type:        "tmpfs",
                Source:      "tmpfs",
                Options:     []string{"nosuid", "strictatime", "mode=755", "size=65536k"},
            },
            {
                Destination: "/dev/pts",
                Type:        "devpts",
                Source:      "devpts",
                Options:     []string{"nosuid", "noexec", "newinstance", "ptmxmode=0666", "mode=0620", "gid=5"},
            },
            {
                Destination: "/sys",
                Type:        "sysfs",
                Source:      "sysfs",
                Options:     []string{"nosuid", "noexec", "nodev", "ro"},
            },
            {
                Destination: "/sys/fs/cgroup",
                Type:        "cgroup",
                Source:      "cgroup",
                Options:     []string{"ro", "nosuid", "noexec", "nodev"},
            },
            {
                Destination: "/dev/mqueue",
                Type:        "mqueue",
                Source:      "mqueue",
                Options:     []string{"nosuid", "noexec", "nodev"},
            },
            {
                Destination: "/dev/shm",
                Type:        "tmpfs",
                Source:      "shm",
                Options:     []string{"nosuid", "noexec", "nodev", "mode=1777"},
            },
        },
        Linux: &specs.Linux{
            MaskedPaths: []string{
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware",
                "/sys/devices/virtual/powercap",
            },
            ReadonlyPaths: []string{
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger",
            },
            Namespaces: []specs.LinuxNamespace{
                {Type: specs.MountNamespace},
                {Type: specs.NetworkNamespace},
                {Type: specs.UTSNamespace},
                {Type: specs.PIDNamespace},
                {Type: specs.IPCNamespace},
            },
            // Devices implicitly contains the following devices:
            // null, zero, full, random, urandom, tty, console, and ptmx.
            // ptmx is a bind mount or symlink of the container's ptmx.
            // See also: https://github.com/opencontainers/runtime-spec/blob/master/config-linux.md#default-devices
            Devices: []specs.LinuxDevice{},
            Resources: &specs.LinuxResources{
                Devices: []specs.LinuxDeviceCgroup{
                    {
                        Allow:  false,
                        Access: "rwm",
                    },
                    {
                        Allow:  true,
                        Type:   "c",
                        Major:  iPtr(1),
                        Minor:  iPtr(5),
                        Access: "rwm",
                    },
                    {
                        Allow:  true,
                        Type:   "c",
                        Major:  iPtr(1),
                        Minor:  iPtr(3),
                        Access: "rwm",
                    },
                    {
                        Allow:  true,
                        Type:   "c",
                        Major:  iPtr(1),
                        Minor:  iPtr(9),
                        Access: "rwm",
                    },
                    {
                        Allow:  true,
                        Type:   "c",
                        Major:  iPtr(1),
                        Minor:  iPtr(8),
                        Access: "rwm",
                    },
                    {
                        Allow:  true,
                        Type:   "c",
                        Major:  iPtr(5),
                        Minor:  iPtr(0),
                        Access: "rwm",
                    },
                    {
                        Allow:  true,
                        Type:   "c",
                        Major:  iPtr(5),
                        Minor:  iPtr(1),
                        Access: "rwm",
                    },
                    {
                        Allow:  false,
                        Type:   "c",
                        Major:  iPtr(10),
                        Minor:  iPtr(229),
                        Access: "rwm",
                    },
                },
            },
        },
    }
}