|
@@ -4,6 +4,7 @@ package daemon // import "github.com/docker/docker/daemon"
|
|
|
|
|
|
import (
|
|
|
"context"
|
|
|
+ "fmt"
|
|
|
"os/exec"
|
|
|
"strings"
|
|
|
|
|
@@ -68,6 +69,80 @@ func (daemon *Daemon) fillPlatformInfo(v *types.Info, sysInfo *sysinfo.SysInfo)
|
|
|
logrus.Warnf("failed to retrieve %s version: %s", defaultInitBinary, err)
|
|
|
v.InitCommit.ID = "N/A"
|
|
|
}
|
|
|
+
|
|
|
+ if !v.MemoryLimit {
|
|
|
+ v.Warnings = append(v.Warnings, "WARNING: No memory limit support")
|
|
|
+ }
|
|
|
+ if !v.SwapLimit {
|
|
|
+ v.Warnings = append(v.Warnings, "WARNING: No swap limit support")
|
|
|
+ }
|
|
|
+ if !v.KernelMemory {
|
|
|
+ v.Warnings = append(v.Warnings, "WARNING: No kernel memory limit support")
|
|
|
+ }
|
|
|
+ if !v.OomKillDisable {
|
|
|
+ v.Warnings = append(v.Warnings, "WARNING: No oom kill disable support")
|
|
|
+ }
|
|
|
+ if !v.CPUCfsQuota {
|
|
|
+ v.Warnings = append(v.Warnings, "WARNING: No cpu cfs quota support")
|
|
|
+ }
|
|
|
+ if !v.CPUCfsPeriod {
|
|
|
+ v.Warnings = append(v.Warnings, "WARNING: No cpu cfs period support")
|
|
|
+ }
|
|
|
+ if !v.CPUShares {
|
|
|
+ v.Warnings = append(v.Warnings, "WARNING: No cpu shares support")
|
|
|
+ }
|
|
|
+ if !v.CPUSet {
|
|
|
+ v.Warnings = append(v.Warnings, "WARNING: No cpuset support")
|
|
|
+ }
|
|
|
+ if !v.IPv4Forwarding {
|
|
|
+ v.Warnings = append(v.Warnings, "WARNING: IPv4 forwarding is disabled")
|
|
|
+ }
|
|
|
+ if !v.BridgeNfIptables {
|
|
|
+ v.Warnings = append(v.Warnings, "WARNING: bridge-nf-call-iptables is disabled")
|
|
|
+ }
|
|
|
+ if !v.BridgeNfIP6tables {
|
|
|
+ v.Warnings = append(v.Warnings, "WARNING: bridge-nf-call-ip6tables is disabled")
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func fillDriverWarnings(v *types.Info) {
|
|
|
+ if v.DriverStatus == nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for _, pair := range v.DriverStatus {
|
|
|
+ if pair[0] == "Data loop file" {
|
|
|
+ msg := fmt.Sprintf("WARNING: %s: usage of loopback devices is "+
|
|
|
+ "strongly discouraged for production use.\n "+
|
|
|
+ "Use `--storage-opt dm.thinpooldev` to specify a custom block storage device.", v.Driver)
|
|
|
+
|
|
|
+ v.Warnings = append(v.Warnings, msg)
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ if pair[0] == "Supports d_type" && pair[1] == "false" {
|
|
|
+ backingFs := getBackingFs(v)
|
|
|
+
|
|
|
+ msg := fmt.Sprintf("WARNING: %s: the backing %s filesystem is formatted without d_type support, which leads to incorrect behavior.\n", v.Driver, backingFs)
|
|
|
+ if backingFs == "xfs" {
|
|
|
+ msg += " Reformat the filesystem with ftype=1 to enable d_type support.\n"
|
|
|
+ }
|
|
|
+ msg += " Running without d_type support will not be supported in future releases."
|
|
|
+
|
|
|
+ v.Warnings = append(v.Warnings, msg)
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func getBackingFs(v *types.Info) string {
|
|
|
+ if v.DriverStatus == nil {
|
|
|
+ return ""
|
|
|
+ }
|
|
|
+ for _, pair := range v.DriverStatus {
|
|
|
+ if pair[0] == "Backing Filesystem" {
|
|
|
+ return pair[1]
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return ""
|
|
|
}
|
|
|
|
|
|
// parseInitVersion parses a Tini version string, and extracts the version.
|