mirror of
https://github.com/containers/podman.git
synced 2025-05-20 08:36:23 +08:00
Support EXPOSE with port ranges
Fixes issue #12293. EXPOSE directive in images should mirror the --expose parameter. Specifically `EXPOSE 20000-20100/tcp` should work the same as `--expose 20000-20100/tcp` Signed-off-by: Colin Bendell <colin@bendell.ca>
This commit is contained in:
@ -5,7 +5,6 @@ import (
|
||||
"fmt"
|
||||
"net"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/containers/common/libimage"
|
||||
@ -13,6 +12,7 @@ import (
|
||||
"github.com/containers/podman/v3/utils"
|
||||
|
||||
"github.com/containers/podman/v3/pkg/specgen"
|
||||
"github.com/containers/podman/v3/pkg/specgenutil"
|
||||
"github.com/containers/podman/v3/pkg/util"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/sirupsen/logrus"
|
||||
@ -410,31 +410,13 @@ func checkProtocol(protocol string, allowSCTP bool) ([]string, error) {
|
||||
}
|
||||
|
||||
func GenExposedPorts(exposedPorts map[string]struct{}) (map[uint16]string, error) {
|
||||
expose := make(map[uint16]string, len(exposedPorts))
|
||||
for imgExpose := range exposedPorts {
|
||||
// Expose format is portNumber[/protocol]
|
||||
splitExpose := strings.SplitN(imgExpose, "/", 2)
|
||||
num, err := strconv.Atoi(splitExpose[0])
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "unable to convert image EXPOSE statement %q to port number", imgExpose)
|
||||
}
|
||||
if num > 65535 || num < 1 {
|
||||
return nil, errors.Errorf("%d from image EXPOSE statement %q is not a valid port number", num, imgExpose)
|
||||
}
|
||||
|
||||
// No need to validate protocol, we'll do it later.
|
||||
newProto := "tcp"
|
||||
if len(splitExpose) == 2 {
|
||||
newProto = splitExpose[1]
|
||||
}
|
||||
|
||||
proto := expose[uint16(num)]
|
||||
if len(proto) > 1 {
|
||||
proto = proto + "," + newProto
|
||||
} else {
|
||||
proto = newProto
|
||||
}
|
||||
expose[uint16(num)] = proto
|
||||
expose := make([]string, 0, len(exposedPorts))
|
||||
for e := range exposedPorts {
|
||||
expose = append(expose, e)
|
||||
}
|
||||
return expose, nil
|
||||
toReturn, err := specgenutil.CreateExpose(expose)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "unable to convert image EXPOSE")
|
||||
}
|
||||
return toReturn, nil
|
||||
}
|
||||
|
@ -314,7 +314,7 @@ func FillOutSpecGen(s *specgen.SpecGenerator, c *entities.ContainerCreateOptions
|
||||
s.Pod = podID
|
||||
}
|
||||
|
||||
expose, err := createExpose(c.Expose)
|
||||
expose, err := CreateExpose(c.Expose)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -53,11 +53,11 @@ func ParseFilters(filter []string) (map[string][]string, error) {
|
||||
return filters, nil
|
||||
}
|
||||
|
||||
// createExpose parses user-provided exposed port definitions and converts them
|
||||
// CreateExpose parses user-provided exposed port definitions and converts them
|
||||
// into SpecGen format.
|
||||
// TODO: The SpecGen format should really handle ranges more sanely - we could
|
||||
// be massively inflating what is sent over the wire with a large range.
|
||||
func createExpose(expose []string) (map[uint16]string, error) {
|
||||
func CreateExpose(expose []string) (map[uint16]string, error) {
|
||||
toReturn := make(map[uint16]string)
|
||||
|
||||
for _, e := range expose {
|
||||
|
Reference in New Issue
Block a user