// +build !windows package main import ( "bytes" "io/ioutil" "os/exec" "strings" "github.com/docker/docker/pkg/parsers/kernel" "github.com/docker/docker/pkg/sysinfo" ) var ( // SysInfo stores information about which features a kernel supports. SysInfo *sysinfo.SysInfo ) func cpuCfsPeriod() bool { return SysInfo.CPUCfsPeriod } func cpuCfsQuota() bool { return SysInfo.CPUCfsQuota } func cpuShare() bool { return SysInfo.CPUShares } func oomControl() bool { return SysInfo.OomKillDisable } func pidsLimit() bool { return SysInfo.PidsLimit } func kernelMemorySupport() bool { return SysInfo.KernelMemory } func memoryLimitSupport() bool { return SysInfo.MemoryLimit } func memoryReservationSupport() bool { return SysInfo.MemoryReservation } func swapMemorySupport() bool { return SysInfo.SwapLimit } func memorySwappinessSupport() bool { return SysInfo.MemorySwappiness } func blkioWeight() bool { return SysInfo.BlkioWeight } func cgroupCpuset() bool { return SysInfo.Cpuset } func seccompEnabled() bool { return supportsSeccomp && SysInfo.Seccomp } func bridgeNfIptables() bool { return !SysInfo.BridgeNFCallIPTablesDisabled } func bridgeNfIP6tables() bool { return !SysInfo.BridgeNFCallIP6TablesDisabled } func unprivilegedUsernsClone() bool { content, err := ioutil.ReadFile("/proc/sys/kernel/unprivileged_userns_clone") return err != nil || !strings.Contains(string(content), "0") } func ambientCapabilities() bool { content, err := ioutil.ReadFile("/proc/self/status") return err != nil || strings.Contains(string(content), "CapAmb:") } func overlayFSSupported() bool { cmd := exec.Command(dockerBinary, "run", "--rm", "busybox", "/bin/sh", "-c", "cat /proc/filesystems") out, err := cmd.CombinedOutput() if err != nil { return false } return bytes.Contains(out, []byte("overlay\n")) } func overlay2Supported() bool { if !overlayFSSupported() { return false } daemonV, err := kernel.ParseRelease(testEnv.DaemonKernelVersion()) if err != nil { return false } requiredV := kernel.VersionInfo{Kernel: 4} return kernel.CompareKernelVersion(*daemonV, requiredV) > -1 } func init() { SysInfo = sysinfo.New(true) }