func create(c *nodecontainer.NodeContainerConfig, node *cluster.Node, poolName string, p DockerProvisioner, relaunch bool) error { client, err := node.Client() if err != nil { return err } c.Config.Image, err = pullImage(c, client, p, poolName) if err != nil { return err } c.Config.Env = append([]string{"DOCKER_ENDPOINT=" + node.Address}, c.Config.Env...) if c.Config.Labels == nil { c.Config.Labels = map[string]string{} } c.Config.Labels["tsuru.nodecontainer"] = strconv.FormatBool(true) c.Config.Labels["tsuru.node.pool"] = poolName c.Config.Labels["tsuru.node.address"] = node.Address c.Config.Labels["tsuru.node.provisioner"] = p.GetName() opts := docker.CreateContainerOptions{ Name: c.Name, HostConfig: &c.HostConfig, Config: &c.Config, } _, err = client.CreateContainer(opts) if err != nil { if err != docker.ErrContainerAlreadyExists { return err } if relaunch { multiErr := tsuruErrors.NewMultiError() err = tryRemovingOld(client, opts.Name) if err != nil { multiErr.Add(errors.Wrapf(err, "unable to remove old node-container")) } _, err = client.CreateContainer(opts) if err != nil { multiErr.Add(errors.Wrapf(err, "unable to create new node-container")) return multiErr } } } err = client.StartContainer(c.Name, nil) if _, ok := err.(*docker.ContainerAlreadyRunning); !ok { return err } return nil }