2015-07-29 14:25:56 -04:00
// +build linux freebsd
2015-04-24 18:36:11 -04:00
package daemon
import (
2016-06-14 12:13:53 -04:00
"fmt"
2015-05-15 16:05:35 -04:00
"net"
2015-04-24 18:36:11 -04:00
"github.com/docker/docker/opts"
flag "github.com/docker/docker/pkg/mflag"
2015-12-21 15:06:46 -05:00
runconfigopts "github.com/docker/docker/runconfig/opts"
2016-05-23 17:49:50 -04:00
"github.com/docker/engine-api/types"
2015-12-21 15:06:46 -05:00
"github.com/docker/go-units"
2015-04-24 18:36:11 -04:00
)
var (
2016-03-18 14:50:19 -04:00
defaultPidFile = "/var/run/docker.pid"
defaultGraph = "/var/lib/docker"
defaultExecRoot = "/var/run/docker"
2015-04-24 18:36:11 -04:00
)
// Config defines the configuration of a docker daemon.
2015-12-10 18:35:10 -05:00
// It includes json tags to deserialize configuration from a file
// using the same names that the flags in the command line uses.
2015-04-24 18:36:11 -04:00
type Config struct {
CommonConfig
// Fields below here are platform specific.
2016-03-24 14:42:03 -04:00
CgroupParent string ` json:"cgroup-parent,omitempty" `
ContainerdAddr string ` json:"containerd,omitempty" `
2015-12-10 18:35:10 -05:00
EnableSelinuxSupport bool ` json:"selinux-enabled,omitempty" `
2016-03-24 14:42:03 -04:00
ExecRoot string ` json:"exec-root,omitempty" `
2015-12-10 18:35:10 -05:00
RemappedRoot string ` json:"userns-remap,omitempty" `
Ulimits map [ string ] * units . Ulimit ` json:"default-ulimits,omitempty" `
2016-05-23 17:49:50 -04:00
Runtimes map [ string ] types . Runtime ` json:"runtimes,omitempty" `
DefaultRuntime string ` json:"default-runtime,omitempty" `
2015-04-24 18:36:11 -04:00
}
2015-05-15 16:05:35 -04:00
// bridgeConfig stores all the bridge driver specific
// configuration.
type bridgeConfig struct {
2016-03-28 14:55:20 -04:00
commonBridgeConfig
// Fields below here are platform specific.
2016-01-25 16:30:33 -05:00
EnableIPv6 bool ` json:"ipv6,omitempty" `
EnableIPTables bool ` json:"iptables,omitempty" `
EnableIPForward bool ` json:"ip-forward,omitempty" `
2016-05-15 23:18:48 -04:00
EnableIPMasq bool ` json:"ip-masq,omitempty" `
2016-01-25 16:30:33 -05:00
EnableUserlandProxy bool ` json:"userland-proxy,omitempty" `
DefaultIP net . IP ` json:"ip,omitempty" `
IP string ` json:"bip,omitempty" `
FixedCIDRv6 string ` json:"fixed-cidr-v6,omitempty" `
DefaultGatewayIPv4 net . IP ` json:"default-gateway,omitempty" `
DefaultGatewayIPv6 net . IP ` json:"default-gateway-v6,omitempty" `
InterContainerCommunication bool ` json:"icc,omitempty" `
2015-05-15 16:05:35 -04:00
}
2015-04-24 18:36:11 -04:00
// InstallFlags adds command-line options to the top-level flag parser for
// the current process.
// Subsequent calls to `flag.Parse` will populate config with values parsed
// from the command-line.
2015-05-05 00:18:28 -04:00
func ( config * Config ) InstallFlags ( cmd * flag . FlagSet , usageFn func ( string ) string ) {
2015-04-24 18:36:11 -04:00
// First handle install flags which are consistent cross-platform
2015-05-05 00:18:28 -04:00
config . InstallCommonFlags ( cmd , usageFn )
2015-04-24 18:36:11 -04:00
// Then platform-specific install flags
2015-05-05 00:18:28 -04:00
cmd . BoolVar ( & config . EnableSelinuxSupport , [ ] string { "-selinux-enabled" } , false , usageFn ( "Enable selinux support" ) )
cmd . StringVar ( & config . SocketGroup , [ ] string { "G" , "-group" } , "docker" , usageFn ( "Group for the unix socket" ) )
2015-12-21 15:06:46 -05:00
config . Ulimits = make ( map [ string ] * units . Ulimit )
cmd . Var ( runconfigopts . NewUlimitOpt ( & config . Ulimits ) , [ ] string { "-default-ulimit" } , usageFn ( "Set default ulimits for containers" ) )
2016-01-25 16:30:33 -05:00
cmd . BoolVar ( & config . bridgeConfig . EnableIPTables , [ ] string { "#iptables" , "-iptables" } , true , usageFn ( "Enable addition of iptables rules" ) )
cmd . BoolVar ( & config . bridgeConfig . EnableIPForward , [ ] string { "#ip-forward" , "-ip-forward" } , true , usageFn ( "Enable net.ipv4.ip_forward" ) )
cmd . BoolVar ( & config . bridgeConfig . EnableIPMasq , [ ] string { "-ip-masq" } , true , usageFn ( "Enable IP masquerading" ) )
cmd . BoolVar ( & config . bridgeConfig . EnableIPv6 , [ ] string { "-ipv6" } , false , usageFn ( "Enable IPv6 networking" ) )
2016-03-24 14:42:03 -04:00
cmd . StringVar ( & config . ExecRoot , [ ] string { "-exec-root" } , defaultExecRoot , usageFn ( "Root directory for execution state files" ) )
2016-01-25 16:30:33 -05:00
cmd . StringVar ( & config . bridgeConfig . IP , [ ] string { "#bip" , "-bip" } , "" , usageFn ( "Specify network bridge IP" ) )
cmd . StringVar ( & config . bridgeConfig . Iface , [ ] string { "b" , "-bridge" } , "" , usageFn ( "Attach containers to a network bridge" ) )
cmd . StringVar ( & config . bridgeConfig . FixedCIDR , [ ] string { "-fixed-cidr" } , "" , usageFn ( "IPv4 subnet for fixed IPs" ) )
cmd . StringVar ( & config . bridgeConfig . FixedCIDRv6 , [ ] string { "-fixed-cidr-v6" } , "" , usageFn ( "IPv6 subnet for fixed IPs" ) )
cmd . Var ( opts . NewIPOpt ( & config . bridgeConfig . DefaultGatewayIPv4 , "" ) , [ ] string { "-default-gateway" } , usageFn ( "Container default gateway IPv4 address" ) )
cmd . Var ( opts . NewIPOpt ( & config . bridgeConfig . DefaultGatewayIPv6 , "" ) , [ ] string { "-default-gateway-v6" } , usageFn ( "Container default gateway IPv6 address" ) )
cmd . BoolVar ( & config . bridgeConfig . InterContainerCommunication , [ ] string { "#icc" , "-icc" } , true , usageFn ( "Enable inter-container communication" ) )
cmd . Var ( opts . NewIPOpt ( & config . bridgeConfig . DefaultIP , "0.0.0.0" ) , [ ] string { "#ip" , "-ip" } , usageFn ( "Default IP when binding container ports" ) )
cmd . BoolVar ( & config . bridgeConfig . EnableUserlandProxy , [ ] string { "-userland-proxy" } , true , usageFn ( "Use userland proxy for loopback traffic" ) )
2015-07-16 17:14:58 -04:00
cmd . BoolVar ( & config . EnableCors , [ ] string { "#api-enable-cors" , "#-api-enable-cors" } , false , usageFn ( "Enable CORS headers in the remote API, this is deprecated by --api-cors-header" ) )
2016-01-06 16:59:01 -05:00
cmd . StringVar ( & config . CgroupParent , [ ] string { "-cgroup-parent" } , "" , usageFn ( "Set parent cgroup for all containers" ) )
2016-01-07 22:43:11 -05:00
cmd . StringVar ( & config . RemappedRoot , [ ] string { "-userns-remap" } , "" , usageFn ( "User/Group setting for user namespaces" ) )
2016-03-26 04:38:00 -04:00
cmd . StringVar ( & config . ContainerdAddr , [ ] string { "-containerd" } , "" , usageFn ( "Path to containerd socket" ) )
2016-06-02 14:10:55 -04:00
cmd . BoolVar ( & config . LiveRestore , [ ] string { "-live-restore" } , false , usageFn ( "Enable live restore of docker when containers are still running" ) )
2016-05-23 17:49:50 -04:00
config . Runtimes = make ( map [ string ] types . Runtime )
cmd . Var ( runconfigopts . NewNamedRuntimeOpt ( "runtimes" , & config . Runtimes ) , [ ] string { "-add-runtime" } , usageFn ( "Register an additional OCI compatible runtime" ) )
cmd . StringVar ( & config . DefaultRuntime , [ ] string { "-default-runtime" } , types . DefaultRuntimeName , usageFn ( "Default OCI runtime to be used" ) )
2015-10-08 11:51:41 -04:00
config . attachExperimentalFlags ( cmd , usageFn )
2015-04-24 18:36:11 -04:00
}
2016-05-23 17:49:50 -04:00
// GetRuntime returns the runtime path and arguments for a given
// runtime name
func ( config * Config ) GetRuntime ( name string ) * types . Runtime {
config . reloadLock . Lock ( )
defer config . reloadLock . Unlock ( )
if rt , ok := config . Runtimes [ name ] ; ok {
return & rt
}
return nil
}
// GetDefaultRuntimeName returns the current default runtime
func ( config * Config ) GetDefaultRuntimeName ( ) string {
config . reloadLock . Lock ( )
rt := config . DefaultRuntime
config . reloadLock . Unlock ( )
return rt
}
// GetAllRuntimes returns a copy of the runtimes map
func ( config * Config ) GetAllRuntimes ( ) map [ string ] types . Runtime {
config . reloadLock . Lock ( )
rts := config . Runtimes
config . reloadLock . Unlock ( )
return rts
}
2016-06-14 12:13:53 -04:00
func ( config * Config ) isSwarmCompatible ( ) error {
if config . IsValueSet ( "cluster-store" ) || config . IsValueSet ( "cluster-advertise" ) {
return fmt . Errorf ( "--cluster-store and --cluster-advertise daemon configurations are incompatible with swarm mode" )
}
if config . LiveRestore {
return fmt . Errorf ( "--live-restore daemon configuration is incompatible with swarm mode" )
}
return nil
}