diff --git a/provider/docker/docker.go b/provider/docker/docker.go index eb84e6b0d..c31ff7a04 100644 --- a/provider/docker/docker.go +++ b/provider/docker/docker.go @@ -594,9 +594,23 @@ func (p *Provider) getPort(container dockerData) string { if label, err := getLabel(container, "traefik.port"); err == nil { return label } - for key := range container.NetworkSettings.Ports { - return key.Port() + + // See iteration order in https://blog.golang.org/go-maps-in-action + var ports []nat.Port + for p := range container.NetworkSettings.Ports { + ports = append(ports, p) } + + less := func(i, j nat.Port) bool { + return i.Int() < j.Int() + } + nat.Sort(ports, less) + + if len(ports) > 0 { + min := ports[0] + return min.Port() + } + return "" } diff --git a/provider/docker/docker_test.go b/provider/docker/docker_test.go index b491d3740..30746b73b 100644 --- a/provider/docker/docker_test.go +++ b/provider/docker/docker_test.go @@ -227,14 +227,13 @@ func TestDockerGetPort(t *testing.T) { })), expected: "80", }, - // FIXME handle this better.. - //{ - // container: containerJSON(ports(nat.PortMap{ - // "80/tcp": {}, - // "443/tcp": {}, - // })), - // expected: "80", - //}, + { + container: containerJSON(ports(nat.PortMap{ + "80/tcp": {}, + "443/tcp": {}, + })), + expected: "80", + }, { container: containerJSON(labels(map[string]string{ "traefik.port": "8080",