diff --git a/client/driver/docker.go b/client/driver/docker.go index f4bdc5f15..0c9828e43 100644 --- a/client/driver/docker.go +++ b/client/driver/docker.go @@ -245,7 +245,7 @@ func (d *DockerDriver) createContainer(ctx *ExecContext, task *structs.Task, dri // Setup port mapping and exposed ports if len(task.Resources.Networks) == 0 { d.logger.Println("[DEBUG] driver.docker: No network interfaces are available") - if len(driverConfig.PortMap[0]) > 0 { + if len(driverConfig.PortMap) == 1 && len(driverConfig.PortMap[0]) > 0 { return c, fmt.Errorf("Trying to map ports but no network interface is available") } } else { @@ -269,9 +269,15 @@ func (d *DockerDriver) createContainer(ctx *ExecContext, task *structs.Task, dri containerToHostPortMap := make(map[string]int) for _, port := range network.DynamicPorts { - containerPort, ok := driverConfig.PortMap[0][port.Label] - if !ok { - containerPort = port.Value + // By default we will map the allocated port 1:1 to the container + containerPort := port.Value + + // If the user has mapped a port using port_map we'll change it here + if len(driverConfig.PortMap) == 1 { + mapped, ok := driverConfig.PortMap[0][port.Label] + if ok { + containerPort = mapped + } } containerPortStr := docker.Port(strconv.Itoa(containerPort)) @@ -318,7 +324,7 @@ func (d *DockerDriver) createContainer(ctx *ExecContext, task *structs.Task, dri config.Env = env.List() return docker.CreateContainerOptions{ - Name: fmt.Sprintf("%s-%s", task.Name, ctx.AllocID), + // Name: fmt.Sprintf("%s-%s", task.Name, ctx.AllocID), Config: config, HostConfig: hostConfig, }, nil @@ -392,7 +398,7 @@ func (d *DockerDriver) Start(ctx *ExecContext, task *structs.Task) (DriverHandle // Now that we have the image we can get the image id dockerImage, err = client.InspectImage(image) if err != nil { - d.logger.Printf("[ERR] driver.docker: failed getting image id for %s\n", image) + d.logger.Printf("[ERR] driver.docker: failed getting image id for %s: %s\n", image, err) return nil, fmt.Errorf("Failed to determine image id for `%s`: %s", image, err) } } @@ -407,15 +413,15 @@ func (d *DockerDriver) Start(ctx *ExecContext, task *structs.Task) (DriverHandle container, err := client.CreateContainer(config) if err != nil { d.logger.Printf("[ERR] driver.docker: failed to create container from image %s: %s\n", image, err) - return nil, fmt.Errorf("Failed to create container from image %s", image) + return nil, fmt.Errorf("Failed to create container from image %s: %s", image, err) } d.logger.Printf("[INFO] driver.docker: created container %s\n", container.ID) // Start the container err = client.StartContainer(container.ID, container.HostConfig) if err != nil { - d.logger.Printf("[ERR] driver.docker: starting container %s\n", container.ID) - return nil, fmt.Errorf("Failed to start container %s", container.ID) + d.logger.Printf("[ERR] driver.docker: failed to start container %s: %s\n", container.ID, err) + return nil, fmt.Errorf("Failed to start container %s: %s", container.ID, err) } d.logger.Printf("[INFO] driver.docker: started container %s\n", container.ID) diff --git a/client/driver/docker_test.go b/client/driver/docker_test.go index 05df5a647..e3397521b 100644 --- a/client/driver/docker_test.go +++ b/client/driver/docker_test.go @@ -293,7 +293,7 @@ func taskTemplate() *structs.Task { &structs.NetworkResource{ IP: "127.0.0.1", ReservedPorts: []structs.Port{{"main", 11110}}, - DynamicPorts: []structs.Port{{"REDIS", 0}}, + DynamicPorts: []structs.Port{{"REDIS", 43330}}, }, }, }, @@ -307,12 +307,15 @@ func TestDocker_StartN(t *testing.T) { task1 := taskTemplate() task1.Resources.Networks[0].ReservedPorts[0] = structs.Port{"main", 11110} + task1.Resources.Networks[0].DynamicPorts[0] = structs.Port{"REDIS", 43331} task2 := taskTemplate() task2.Resources.Networks[0].ReservedPorts[0] = structs.Port{"main", 22222} + task2.Resources.Networks[0].DynamicPorts[0] = structs.Port{"REDIS", 43332} task3 := taskTemplate() task3.Resources.Networks[0].ReservedPorts[0] = structs.Port{"main", 33333} + task3.Resources.Networks[0].DynamicPorts[0] = structs.Port{"REDIS", 43333} taskList := []*structs.Task{task1, task2, task3} @@ -359,14 +362,17 @@ func TestDocker_StartNVersions(t *testing.T) { task1 := taskTemplate() task1.Config["image"] = "redis" task1.Resources.Networks[0].ReservedPorts[0] = structs.Port{"main", 11110} + task1.Resources.Networks[0].DynamicPorts[0] = structs.Port{"REDIS", 43331} task2 := taskTemplate() task2.Config["image"] = "redis:latest" task2.Resources.Networks[0].ReservedPorts[0] = structs.Port{"main", 22222} + task2.Resources.Networks[0].DynamicPorts[0] = structs.Port{"REDIS", 43332} task3 := taskTemplate() task3.Config["image"] = "redis:3.0" task3.Resources.Networks[0].ReservedPorts[0] = structs.Port{"main", 33333} + task3.Resources.Networks[0].DynamicPorts[0] = structs.Port{"REDIS", 43333} taskList := []*structs.Task{task1, task2, task3} diff --git a/client/driver/driver_test.go b/client/driver/driver_test.go index 7065153a1..93727bd03 100644 --- a/client/driver/driver_test.go +++ b/client/driver/driver_test.go @@ -19,7 +19,7 @@ var basicResources = &structs.Resources{ &structs.NetworkResource{ IP: "0.0.0.0", ReservedPorts: []structs.Port{{"main", 12345}}, - DynamicPorts: []structs.Port{{"HTTP", 0}}, + DynamicPorts: []structs.Port{{"HTTP", 43330}}, }, }, }