瀏覽代碼

Add error checking for hostPort range

This fix catches the case where there is a single container port
and a dynamic host port and will fail out gracefully
Example docker-compose.yml snippet:
    port:
        ports:
            - "8091-8093:8091"
            - "80:8080"

Signed-off-by: Tony Abboud <tdabboud@hotmail.com>
Tony Abboud 8 年之前
父節點
當前提交
135f8f9674
共有 2 個文件被更改,包括 16 次插入7 次删除
  1. 5 3
      cli/compose/convert/service.go
  2. 11 4
      opts/port.go

+ 5 - 3
cli/compose/convert/service.go

@@ -301,9 +301,11 @@ func convertEndpointSpec(source []string) (*swarm.EndpointSpec, error) {
 	}
 
 	for port := range ports {
-		portConfigs = append(
-			portConfigs,
-			opts.ConvertPortToPortConfig(port, portBindings)...)
+		portConfig, err := opts.ConvertPortToPortConfig(port, portBindings)
+		if err != nil {
+			return nil, err
+		}
+		portConfigs = append(portConfigs, portConfig...)
 	}
 
 	return &swarm.EndpointSpec{Ports: portConfigs}, nil

+ 11 - 4
opts/port.go

@@ -98,7 +98,11 @@ func (p *PortOpt) Set(value string) error {
 		ports, portBindings, _ := nat.ParsePortSpecs([]string{value})
 
 		for port := range ports {
-			portConfigs = append(portConfigs, ConvertPortToPortConfig(port, portBindings)...)
+			portConfig, err := ConvertPortToPortConfig(port, portBindings)
+			if err != nil {
+				return err
+			}
+			portConfigs = append(portConfigs, portConfig...)
 		}
 		p.ports = append(p.ports, portConfigs...)
 	}
@@ -129,11 +133,14 @@ func (p *PortOpt) Value() []swarm.PortConfig {
 func ConvertPortToPortConfig(
 	port nat.Port,
 	portBindings map[nat.Port][]nat.PortBinding,
-) []swarm.PortConfig {
+) ([]swarm.PortConfig, error) {
 	ports := []swarm.PortConfig{}
 
 	for _, binding := range portBindings[port] {
-		hostPort, _ := strconv.ParseUint(binding.HostPort, 10, 16)
+		hostPort, err := strconv.ParseUint(binding.HostPort, 10, 16)
+		if err != nil && binding.HostPort != "" {
+			return nil, fmt.Errorf("invalid hostport binding (%s) for port (%s)", binding.HostPort, port.Port())
+		}
 		ports = append(ports, swarm.PortConfig{
 			//TODO Name: ?
 			Protocol:      swarm.PortConfigProtocol(strings.ToLower(port.Proto())),
@@ -142,5 +149,5 @@ func ConvertPortToPortConfig(
 			PublishMode:   swarm.PortConfigPublishModeIngress,
 		})
 	}
-	return ports
+	return ports, nil
 }