func (d Docker) Run(cont *engine.Container) (err error) { contPorts := map[dockerclient.Port]struct{}{} hostPorts := map[dockerclient.Port][]dockerclient.PortBinding{} for _, m := range cont.Ports { for k, v := range m { var port dockerclient.Port port = dockerclient.Port(fmt.Sprintf("%s/tcp", k)) contPorts[port] = struct{}{} hostPorts[port] = []dockerclient.PortBinding{ dockerclient.PortBinding{HostIP: "", HostPort: v}, } } } opts := dockerclient.CreateContainerOptions{ Name: cont.Name, Config: &dockerclient.Config{ Image: cont.Image.Name, Hostname: cont.Hostname, Cmd: cont.Cmd, Tty: cont.Tty, ExposedPorts: contPorts, Env: cont.Env, }, } hostConfig := &dockerclient.HostConfig{ NetworkMode: cont.NetworkMode, PortBindings: hostPorts, } log.Debugln("Create container:", cont.Name) c, err := d.client.CreateContainer(opts) if err != nil { return } err = d.client.StartContainer(c.ID, hostConfig) if err != nil { return } c, err = d.client.InspectContainer(c.ID) if err != nil { return } cont.Id = c.ID // Saving network informations if c.NetworkSettings == nil { return errors.New("Failed to get container network settings") } cont.Gateway = c.NetworkSettings.Gateway for port, bindings := range c.NetworkSettings.Ports { contPort := strings.TrimSuffix(string(port), "/tcp") for _, elem := range cont.Ports { hostPort, prs := elem[contPort] if prs { if hostPort != bindings[0].HostPort { elem[contPort] = bindings[0].HostPort } break } } } // Swarm extras if c.Node != nil { cont.IP = c.Node.IP } log.Debugln("Container:", cont) log.Infoln("Run:", cont.Name) return }