// newContainer creates a new container in Docker and stores it in the database. func newContainer(app provision.App, imageId string, cmds []string) (container, error) { contName := containerName() cont := container{ AppName: app.GetName(), Type: app.GetPlatform(), Name: contName, Status: "created", } coll := collection() defer coll.Close() if err := coll.Insert(cont); err != nil { log.Errorf("error on inserting container into database %s - %s", cont.Name, err) return container{}, err } port, err := getPort() if err != nil { log.Errorf("error on getting port for container %s - %s", cont.AppName, port) return container{}, 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: contName, Config: &config} hostID, c, err := dockerCluster().CreateContainer(opts) if err != nil { log.Errorf("error on creating container in docker %s - %s", cont.AppName, err) return container{}, err } cont.ID = c.ID cont.HostAddr = getHostAddr(hostID) err = coll.Update(bson.M{"name": cont.Name}, cont) if err != nil { log.Errorf("error on updating container into database %s - %s", cont.ID, err) return container{}, err } return cont, nil }