diff --git a/cli/command/container/opts.go b/cli/command/container/opts.go index 7cddf8f784b3..a0cc1cb8f9d3 100644 --- a/cli/command/container/opts.go +++ b/cli/command/container/opts.go @@ -426,6 +426,9 @@ func parse(flags *pflag.FlagSet, copts *containerOptions, serverOS string) (*con return nil, err } + // short syntax ([ip:]public:private[/proto]) + // + // TODO(thaJeztah): we need an equivalent that handles the "ip-address" part without depending on the nat package. ports, natPortBindings, err := nat.ParsePortSpecs(convertedOpts) if err != nil { return nil, err diff --git a/cli/compose/loader/loader.go b/cli/compose/loader/loader.go index 844ce8c93d71..edc79430b676 100644 --- a/cli/compose/loader/loader.go +++ b/cli/compose/loader/loader.go @@ -918,8 +918,9 @@ var transformStringToDuration TransformerFunc = func(value any) (any, error) { } func toServicePortConfigs(value string) ([]any, error) { - var portConfigs []any - + // short syntax ([ip:]public:private[/proto]) + // + // TODO(thaJeztah): we need an equivalent that handles the "ip-address" part without depending on the nat package. ports, portBindings, err := nat.ParsePortSpecs([]string{value}) if err != nil { return nil, err @@ -931,6 +932,7 @@ func toServicePortConfigs(value string) ([]any, error) { } sort.Strings(keys) + var portConfigs []any for _, key := range keys { // Reuse ConvertPortToPortConfig so that it is consistent port, err := network.ParsePort(key) diff --git a/opts/swarmopts/port.go b/opts/swarmopts/port.go index ac38e3bcd772..2a8c2b71c039 100644 --- a/opts/swarmopts/port.go +++ b/opts/swarmopts/port.go @@ -100,7 +100,9 @@ func (p *PortOpt) Set(value string) error { p.ports = append(p.ports, pConfig) } else { - // short syntax + // short syntax ([ip:]public:private[/proto]) + // + // TODO(thaJeztah): we need an equivalent that handles the "ip-address" part without depending on the nat package. ports, portBindingMap, err := nat.ParsePortSpecs([]string{value}) if err != nil { return err @@ -162,18 +164,17 @@ func ConvertPortToPortConfig( logrus.Warnf("ignoring IP-address (%s:%s) service will listen on '0.0.0.0'", net.JoinHostPort(binding.HostIP, binding.HostPort), portProto.String()) } - startHostPort, endHostPort, err := nat.ParsePortRange(binding.HostPort) - + pr, err := network.ParsePortRange(binding.HostPort) if err != nil && binding.HostPort != "" { return nil, fmt.Errorf("invalid hostport binding (%s) for port (%d)", binding.HostPort, portProto.Num()) } - for i := startHostPort; i <= endHostPort; i++ { + for p := range pr.All() { ports = append(ports, swarm.PortConfig{ // TODO Name: ? Protocol: portProto.Proto(), TargetPort: uint32(portProto.Num()), - PublishedPort: uint32(i), + PublishedPort: uint32(p.Num()), PublishMode: swarm.PortConfigPublishModeIngress, }) }