// creates a new container in Docker. func (c *container) create(app provision.App, imageId string, cmds []string, destinationHosts ...string) error { port, err := getPort() if err != nil { log.Errorf("error on getting port for container %s - %s", c.AppName, port) return err } user, _ := config.GetString("docker:ssh:user") gitUnitRepo, _ := config.GetString("git:unit-repo") sharedMount, _ := config.GetString("docker:sharedfs:mountpoint") sharedBasedir, _ := config.GetString("docker:sharedfs:hostdir") exposedPorts := map[docker.Port]struct{}{ docker.Port(port + "/tcp"): {}, docker.Port("22/tcp"): {}, } config := docker.Config{ Image: imageId, Cmd: cmds, User: user, ExposedPorts: exposedPorts, AttachStdin: false, AttachStdout: false, AttachStderr: false, Memory: int64(app.GetMemory() * 1024 * 1024), MemorySwap: int64(app.GetSwap() * 1024 * 1024), } config.Env = append(config.Env, fmt.Sprintf("TSURU_APP_DIR=%s", gitUnitRepo)) if sharedMount != "" && sharedBasedir != "" { config.Volumes = map[string]struct{}{ sharedMount: {}, } config.Env = append(config.Env, fmt.Sprintf("TSURU_SHAREDFS_MOUNTPOINT=%s", sharedMount)) } opts := docker.CreateContainerOptions{Name: c.Name, Config: &config} var nodeList []string if len(destinationHosts) > 0 { nodeName, err := hostToNodeAddress(destinationHosts[0]) if err != nil { return err } nodeList = []string{nodeName} } addr, cont, err := dockerCluster().CreateContainerSchedulerOpts(opts, app.GetName(), nodeList...) if err != nil { log.Errorf("error on creating container in docker %s - %s", c.AppName, err) return err } c.ID = cont.ID c.HostAddr = urlToHost(addr) c.User = user return nil }
func (c *Container) hostConfig(app provision.App, isDeploy bool) (*docker.HostConfig, error) { sharedBasedir, _ := config.GetString("docker:sharedfs:hostdir") sharedMount, _ := config.GetString("docker:sharedfs:mountpoint") sharedIsolation, _ := config.GetBool("docker:sharedfs:app-isolation") sharedSalt, _ := config.GetString("docker:sharedfs:salt") hostConfig := docker.HostConfig{ CPUShares: int64(app.GetCpuShare()), } if !isDeploy { hostConfig.Memory = app.GetMemory() hostConfig.MemorySwap = app.GetMemory() + app.GetSwap() hostConfig.RestartPolicy = docker.AlwaysRestart() hostConfig.PortBindings = map[docker.Port][]docker.PortBinding{ docker.Port(c.ExposedPort): {{HostIP: "", HostPort: ""}}, } pool := app.GetPool() driver, opts, logErr := LogOpts(pool) if logErr != nil { return nil, logErr } hostConfig.LogConfig = docker.LogConfig{ Type: driver, Config: opts, } } else { hostConfig.OomScoreAdj = 1000 } hostConfig.SecurityOpt, _ = config.GetList("docker:security-opts") if sharedBasedir != "" && sharedMount != "" { if sharedIsolation { var appHostDir string if sharedSalt != "" { h := crypto.SHA1.New() io.WriteString(h, sharedSalt+c.AppName) appHostDir = fmt.Sprintf("%x", h.Sum(nil)) } else { appHostDir = c.AppName } hostConfig.Binds = append(hostConfig.Binds, fmt.Sprintf("%s/%s:%s:rw", sharedBasedir, appHostDir, sharedMount)) } else { hostConfig.Binds = append(hostConfig.Binds, fmt.Sprintf("%s:%s:rw", sharedBasedir, sharedMount)) } } return &hostConfig, nil }
func (c *container) start(p *dockerProvisioner, app provision.App, isDeploy bool) error { port, err := getPort() if err != nil { return err } sharedBasedir, _ := config.GetString("docker:sharedfs:hostdir") sharedMount, _ := config.GetString("docker:sharedfs:mountpoint") sharedIsolation, _ := config.GetBool("docker:sharedfs:app-isolation") sharedSalt, _ := config.GetString("docker:sharedfs:salt") hostConfig := docker.HostConfig{ Memory: app.GetMemory(), MemorySwap: app.GetMemory() + app.GetSwap(), CPUShares: int64(app.GetCpuShare()), } if !isDeploy { hostConfig.RestartPolicy = docker.AlwaysRestart() hostConfig.PortBindings = map[docker.Port][]docker.PortBinding{ docker.Port(port + "/tcp"): {{HostIP: "", HostPort: ""}}, } hostConfig.LogConfig = docker.LogConfig{ Type: "syslog", Config: map[string]string{ "syslog-address": fmt.Sprintf("udp://localhost:%d", getBsSysLogPort()), }, } } hostConfig.SecurityOpt, _ = config.GetList("docker:security-opts") if sharedBasedir != "" && sharedMount != "" { if sharedIsolation { var appHostDir string if sharedSalt != "" { h := crypto.SHA1.New() io.WriteString(h, sharedSalt+c.AppName) appHostDir = fmt.Sprintf("%x", h.Sum(nil)) } else { appHostDir = c.AppName } hostConfig.Binds = append(hostConfig.Binds, fmt.Sprintf("%s/%s:%s:rw", sharedBasedir, appHostDir, sharedMount)) } else { hostConfig.Binds = append(hostConfig.Binds, fmt.Sprintf("%s:%s:rw", sharedBasedir, sharedMount)) } } err = p.getCluster().StartContainer(c.ID, &hostConfig) if err != nil { return err } initialStatus := provision.StatusStarting.String() if isDeploy { initialStatus = provision.StatusBuilding.String() } return c.setStatus(p, initialStatus, false) }
// creates a new container in Docker. func (c *container) create(app provision.App, imageId string, cmds []string, destinationHosts ...string) error { port, err := getPort() if err != nil { log.Errorf("error on getting port for container %s - %s", c.AppName, port) return err } user, _ := config.GetString("docker:ssh:user") exposedPorts := make(map[docker.Port]struct{}, 1) p := docker.Port(fmt.Sprintf("%s/tcp", port)) exposedPorts[p] = struct{}{} config := docker.Config{ Image: imageId, Cmd: cmds, User: user, ExposedPorts: exposedPorts, AttachStdin: false, AttachStdout: false, AttachStderr: false, Memory: int64(app.GetMemory() * 1024 * 1024), MemorySwap: int64(app.GetSwap() * 1024 * 1024), } opts := docker.CreateContainerOptions{Name: c.Name, Config: &config} var nodeList []string if len(destinationHosts) > 0 { nodeName, err := hostToNodeName(destinationHosts[0]) if err != nil { return err } nodeList = []string{nodeName} } hostID, cont, err := dockerCluster().CreateContainerSchedulerOpts(opts, app.GetName(), nodeList...) if err != nil { log.Errorf("error on creating container in docker %s - %s", c.AppName, err) return err } c.ID = cont.ID c.HostAddr = getHostAddr(hostID) return nil }