github.com/stchris/docker@v1.4.2-0.20150106053530-1510a324dbd5/runconfig/hostconfig.go (about)

     1  package runconfig
     2  
     3  import (
     4  	"strings"
     5  
     6  	"github.com/docker/docker/engine"
     7  	"github.com/docker/docker/nat"
     8  	"github.com/docker/docker/utils"
     9  )
    10  
    11  type NetworkMode string
    12  
    13  // IsPrivate indicates whether container use it's private network stack
    14  func (n NetworkMode) IsPrivate() bool {
    15  	return !(n.IsHost() || n.IsContainer() || n.IsNone())
    16  }
    17  
    18  func (n NetworkMode) IsHost() bool {
    19  	return n == "host"
    20  }
    21  
    22  func (n NetworkMode) IsContainer() bool {
    23  	parts := strings.SplitN(string(n), ":", 2)
    24  	return len(parts) > 1 && parts[0] == "container"
    25  }
    26  
    27  func (n NetworkMode) IsNone() bool {
    28  	return n == "none"
    29  }
    30  
    31  type IpcMode string
    32  
    33  // IsPrivate indicates whether container use it's private ipc stack
    34  func (n IpcMode) IsPrivate() bool {
    35  	return !(n.IsHost() || n.IsContainer())
    36  }
    37  
    38  func (n IpcMode) IsHost() bool {
    39  	return n == "host"
    40  }
    41  
    42  func (n IpcMode) IsContainer() bool {
    43  	parts := strings.SplitN(string(n), ":", 2)
    44  	return len(parts) > 1 && parts[0] == "container"
    45  }
    46  
    47  func (n IpcMode) Valid() bool {
    48  	parts := strings.Split(string(n), ":")
    49  	switch mode := parts[0]; mode {
    50  	case "", "host":
    51  	case "container":
    52  		if len(parts) != 2 || parts[1] == "" {
    53  			return false
    54  		}
    55  	default:
    56  		return false
    57  	}
    58  	return true
    59  }
    60  
    61  func (n IpcMode) Container() string {
    62  	parts := strings.SplitN(string(n), ":", 2)
    63  	if len(parts) > 1 {
    64  		return parts[1]
    65  	}
    66  	return ""
    67  }
    68  
    69  type DeviceMapping struct {
    70  	PathOnHost        string
    71  	PathInContainer   string
    72  	CgroupPermissions string
    73  }
    74  
    75  type RestartPolicy struct {
    76  	Name              string
    77  	MaximumRetryCount int
    78  }
    79  
    80  type HostConfig struct {
    81  	Binds           []string
    82  	ContainerIDFile string
    83  	LxcConf         []utils.KeyValuePair
    84  	Privileged      bool
    85  	PortBindings    nat.PortMap
    86  	Links           []string
    87  	PublishAllPorts bool
    88  	Dns             []string
    89  	DnsSearch       []string
    90  	ExtraHosts      []string
    91  	VolumesFrom     []string
    92  	Devices         []DeviceMapping
    93  	NetworkMode     NetworkMode
    94  	IpcMode         IpcMode
    95  	CapAdd          []string
    96  	CapDrop         []string
    97  	RestartPolicy   RestartPolicy
    98  	SecurityOpt     []string
    99  }
   100  
   101  // This is used by the create command when you want to set both the
   102  // Config and the HostConfig in the same call
   103  type ConfigAndHostConfig struct {
   104  	Config
   105  	HostConfig HostConfig
   106  }
   107  
   108  func MergeConfigs(config *Config, hostConfig *HostConfig) *ConfigAndHostConfig {
   109  	return &ConfigAndHostConfig{
   110  		*config,
   111  		*hostConfig,
   112  	}
   113  }
   114  
   115  func ContainerHostConfigFromJob(job *engine.Job) *HostConfig {
   116  	if job.EnvExists("HostConfig") {
   117  		hostConfig := HostConfig{}
   118  		job.GetenvJson("HostConfig", &hostConfig)
   119  		return &hostConfig
   120  	}
   121  
   122  	hostConfig := &HostConfig{
   123  		ContainerIDFile: job.Getenv("ContainerIDFile"),
   124  		Privileged:      job.GetenvBool("Privileged"),
   125  		PublishAllPorts: job.GetenvBool("PublishAllPorts"),
   126  		NetworkMode:     NetworkMode(job.Getenv("NetworkMode")),
   127  		IpcMode:         IpcMode(job.Getenv("IpcMode")),
   128  	}
   129  
   130  	job.GetenvJson("LxcConf", &hostConfig.LxcConf)
   131  	job.GetenvJson("PortBindings", &hostConfig.PortBindings)
   132  	job.GetenvJson("Devices", &hostConfig.Devices)
   133  	job.GetenvJson("RestartPolicy", &hostConfig.RestartPolicy)
   134  	hostConfig.SecurityOpt = job.GetenvList("SecurityOpt")
   135  	if Binds := job.GetenvList("Binds"); Binds != nil {
   136  		hostConfig.Binds = Binds
   137  	}
   138  	if Links := job.GetenvList("Links"); Links != nil {
   139  		hostConfig.Links = Links
   140  	}
   141  	if Dns := job.GetenvList("Dns"); Dns != nil {
   142  		hostConfig.Dns = Dns
   143  	}
   144  	if DnsSearch := job.GetenvList("DnsSearch"); DnsSearch != nil {
   145  		hostConfig.DnsSearch = DnsSearch
   146  	}
   147  	if ExtraHosts := job.GetenvList("ExtraHosts"); ExtraHosts != nil {
   148  		hostConfig.ExtraHosts = ExtraHosts
   149  	}
   150  	if VolumesFrom := job.GetenvList("VolumesFrom"); VolumesFrom != nil {
   151  		hostConfig.VolumesFrom = VolumesFrom
   152  	}
   153  	if CapAdd := job.GetenvList("CapAdd"); CapAdd != nil {
   154  		hostConfig.CapAdd = CapAdd
   155  	}
   156  	if CapDrop := job.GetenvList("CapDrop"); CapDrop != nil {
   157  		hostConfig.CapDrop = CapDrop
   158  	}
   159  
   160  	return hostConfig
   161  }