github.com/endophage/docker@v1.4.2-0.20161027011718-242853499895/runconfig/hostconfig_unix.go (about) 1 // +build !windows,!solaris 2 3 package runconfig 4 5 import ( 6 "fmt" 7 "runtime" 8 "strings" 9 10 "github.com/docker/docker/api/types/container" 11 "github.com/docker/docker/pkg/sysinfo" 12 ) 13 14 // DefaultDaemonNetworkMode returns the default network stack the daemon should 15 // use. 16 func DefaultDaemonNetworkMode() container.NetworkMode { 17 return container.NetworkMode("bridge") 18 } 19 20 // IsPreDefinedNetwork indicates if a network is predefined by the daemon 21 func IsPreDefinedNetwork(network string) bool { 22 n := container.NetworkMode(network) 23 return n.IsBridge() || n.IsHost() || n.IsNone() || n.IsDefault() || network == "ingress" 24 } 25 26 // ValidateNetMode ensures that the various combinations of requested 27 // network settings are valid. 28 func ValidateNetMode(c *container.Config, hc *container.HostConfig) error { 29 // We may not be passed a host config, such as in the case of docker commit 30 if hc == nil { 31 return nil 32 } 33 parts := strings.Split(string(hc.NetworkMode), ":") 34 if parts[0] == "container" { 35 if len(parts) < 2 || parts[1] == "" { 36 return fmt.Errorf("--net: invalid net mode: invalid container format container:<name|id>") 37 } 38 } 39 40 if hc.NetworkMode.IsContainer() && c.Hostname != "" { 41 return ErrConflictNetworkHostname 42 } 43 44 if hc.UTSMode.IsHost() && c.Hostname != "" { 45 return ErrConflictUTSHostname 46 } 47 48 if hc.NetworkMode.IsHost() && len(hc.Links) > 0 { 49 return ErrConflictHostNetworkAndLinks 50 } 51 52 if hc.NetworkMode.IsContainer() && len(hc.Links) > 0 { 53 return ErrConflictContainerNetworkAndLinks 54 } 55 56 if hc.NetworkMode.IsContainer() && len(hc.DNS) > 0 { 57 return ErrConflictNetworkAndDNS 58 } 59 60 if hc.NetworkMode.IsContainer() && len(hc.ExtraHosts) > 0 { 61 return ErrConflictNetworkHosts 62 } 63 64 if (hc.NetworkMode.IsContainer() || hc.NetworkMode.IsHost()) && c.MacAddress != "" { 65 return ErrConflictContainerNetworkAndMac 66 } 67 68 if hc.NetworkMode.IsContainer() && (len(hc.PortBindings) > 0 || hc.PublishAllPorts == true) { 69 return ErrConflictNetworkPublishPorts 70 } 71 72 if hc.NetworkMode.IsContainer() && len(c.ExposedPorts) > 0 { 73 return ErrConflictNetworkExposePorts 74 } 75 return nil 76 } 77 78 // ValidateIsolation performs platform specific validation of 79 // isolation in the hostconfig structure. Linux only supports "default" 80 // which is LXC container isolation 81 func ValidateIsolation(hc *container.HostConfig) error { 82 // We may not be passed a host config, such as in the case of docker commit 83 if hc == nil { 84 return nil 85 } 86 if !hc.Isolation.IsValid() { 87 return fmt.Errorf("invalid --isolation: %q - %s only supports 'default'", hc.Isolation, runtime.GOOS) 88 } 89 return nil 90 } 91 92 // ValidateQoS performs platform specific validation of the QoS settings 93 func ValidateQoS(hc *container.HostConfig) error { 94 // We may not be passed a host config, such as in the case of docker commit 95 if hc == nil { 96 return nil 97 } 98 99 if hc.IOMaximumBandwidth != 0 { 100 return fmt.Errorf("invalid QoS settings: %s does not support --io-maxbandwidth", runtime.GOOS) 101 } 102 103 if hc.IOMaximumIOps != 0 { 104 return fmt.Errorf("invalid QoS settings: %s does not support --io-maxiops", runtime.GOOS) 105 } 106 return nil 107 } 108 109 // ValidateResources performs platform specific validation of the resource settings 110 // cpu-rt-runtime and cpu-rt-period can not be greater than their parent, cpu-rt-runtime requires sys_nice 111 func ValidateResources(hc *container.HostConfig, si *sysinfo.SysInfo) error { 112 // We may not be passed a host config, such as in the case of docker commit 113 if hc == nil { 114 return nil 115 } 116 117 if hc.Resources.CPURealtimePeriod > 0 && !si.CPURealtimePeriod { 118 return fmt.Errorf("invalid --cpu-rt-period: Your kernel does not support cgroup rt period") 119 } 120 121 if hc.Resources.CPURealtimeRuntime > 0 && !si.CPURealtimeRuntime { 122 return fmt.Errorf("invalid --cpu-rt-runtime: Your kernel does not support cgroup rt runtime") 123 } 124 125 if hc.Resources.CPURealtimePeriod != 0 && hc.Resources.CPURealtimeRuntime != 0 && hc.Resources.CPURealtimeRuntime > hc.Resources.CPURealtimePeriod { 126 return fmt.Errorf("invalid --cpu-rt-runtime: rt runtime cannot be higher than rt period") 127 } 128 return nil 129 }