func configureServiceContainer(srv *def.Service, ops *def.Operation) (docker.CreateContainerOptions, error) { if ops.ContainerNumber == 0 { ops.ContainerNumber = 1 } opts := docker.CreateContainerOptions{ Name: ops.SrvContainerName, Config: &docker.Config{ Hostname: srv.HostName, Domainname: srv.DomainName, User: srv.User, Memory: srv.MemLimit, CPUShares: srv.CPUShares, AttachStdin: false, AttachStdout: false, AttachStderr: false, Tty: true, OpenStdin: false, Env: srv.Environment, Labels: ops.Labels, Cmd: strings.Fields(srv.Command), Entrypoint: strings.Fields(srv.EntryPoint), Image: srv.Image, WorkingDir: srv.WorkDir, NetworkDisabled: false, }, HostConfig: &docker.HostConfig{ Binds: srv.Volumes, Links: srv.Links, PublishAllPorts: ops.PublishAllPorts, Privileged: ops.Privileged, ReadonlyRootfs: false, DNS: srv.DNS, DNSSearch: srv.DNSSearch, VolumesFrom: srv.VolumesFrom, CapAdd: ops.CapAdd, CapDrop: ops.CapDrop, RestartPolicy: docker.NeverRestart(), NetworkMode: "bridge", }, } if ops.Attach { opts.Config.AttachStdin = true opts.Config.AttachStdout = true opts.Config.AttachStderr = true opts.Config.OpenStdin = true } if ops.Restart == "always" { opts.HostConfig.RestartPolicy = docker.AlwaysRestart() } else if strings.Contains(ops.Restart, "max") { times, err := strconv.Atoi(strings.Split(ops.Restart, ":")[1]) if err != nil { return docker.CreateContainerOptions{}, err } opts.HostConfig.RestartPolicy = docker.RestartOnFailure(times) } opts.Config.ExposedPorts = make(map[docker.Port]struct{}) opts.HostConfig.PortBindings = make(map[docker.Port][]docker.PortBinding) opts.Config.Volumes = make(map[string]struct{}) for _, port := range srv.Ports { pS := strings.Split(port, ":") pC := docker.Port(util.PortAndProtocol(pS[len(pS)-1])) if len(pS) > 1 { pH := docker.PortBinding{ HostPort: pS[len(pS)-2], } if len(pS) == 3 { // ipv4 pH.HostIP = pS[0] } else if len(pS) > 3 { // ipv6 pH.HostIP = strings.Join(pS[:len(pS)-2], ":") } opts.Config.ExposedPorts[pC] = struct{}{} opts.HostConfig.PortBindings[pC] = []docker.PortBinding{pH} } else { opts.Config.ExposedPorts[pC] = struct{}{} } } for _, vol := range srv.Volumes { opts.Config.Volumes[strings.Split(vol, ":")[1]] = struct{}{} } return opts, nil }
func configureServiceContainer(srv *def.Service, ops *def.Operation) docker.CreateContainerOptions { if ops.ContainerNumber == 0 { ops.ContainerNumber = 1 } opts := docker.CreateContainerOptions{ Name: ops.SrvContainerName, Config: &docker.Config{ Hostname: srv.HostName, Domainname: srv.DomainName, User: srv.User, Memory: srv.MemLimit, CPUShares: srv.CPUShares, AttachStdin: false, AttachStdout: false, AttachStderr: false, Tty: true, OpenStdin: false, Env: srv.Environment, Labels: ops.Labels, Image: srv.Image, NetworkDisabled: false, }, HostConfig: &docker.HostConfig{ Binds: srv.Volumes, Links: srv.Links, PublishAllPorts: ops.PublishAllPorts, Privileged: ops.Privileged, ReadonlyRootfs: false, DNS: srv.DNS, DNSSearch: srv.DNSSearch, VolumesFrom: srv.VolumesFrom, CapAdd: ops.CapAdd, CapDrop: ops.CapDrop, RestartPolicy: docker.NeverRestart(), //default. overide below NetworkMode: "bridge", }, } // some fields may be set in the dockerfile and we only want to overwrite if they are present in the service def if srv.EntryPoint != "" { opts.Config.Entrypoint = strings.Fields(srv.EntryPoint) } if srv.Command != "" { opts.Config.Cmd = strings.Fields(srv.Command) } if srv.WorkDir != "" { opts.Config.WorkingDir = srv.WorkDir } //[zr] used to be ops.Restart if srv.Restart == "always" { opts.HostConfig.RestartPolicy = docker.AlwaysRestart() } else if strings.Contains(srv.Restart, "max") { times, err := strconv.Atoi(strings.Split(srv.Restart, ":")[1]) if err != nil { return docker.CreateContainerOptions{} } opts.HostConfig.RestartPolicy = docker.RestartOnFailure(times) } opts.Config.ExposedPorts = make(map[docker.Port]struct{}) opts.HostConfig.PortBindings = make(map[docker.Port][]docker.PortBinding) opts.Config.Volumes = make(map[string]struct{}) // Don't fill in port bindings if randomizing the ports. if !ops.PublishAllPorts { for _, port := range srv.Ports { pS := strings.Split(port, ":") pC := docker.Port(util.PortAndProtocol(pS[len(pS)-1])) opts.Config.ExposedPorts[pC] = struct{}{} if len(pS) > 1 { pH := docker.PortBinding{ HostPort: pS[len(pS)-2], } if len(pS) == 3 { // ipv4 pH.HostIP = pS[0] } else if len(pS) > 3 { // ipv6 pH.HostIP = strings.Join(pS[:len(pS)-2], ":") } opts.HostConfig.PortBindings[pC] = []docker.PortBinding{pH} } else { pH := docker.PortBinding{ HostPort: pS[0], } opts.HostConfig.PortBindings[pC] = []docker.PortBinding{pH} } } } for _, vol := range srv.Volumes { opts.Config.Volumes[strings.Split(vol, ":")[1]] = struct{}{} } return opts }