diff --git a/cli/command/formatter/container.go b/cli/command/formatter/container.go index 410b5cdce51e..a282921a5110 100644 --- a/cli/command/formatter/container.go +++ b/cli/command/formatter/container.go @@ -458,7 +458,7 @@ func comparePorts(i, j container.PortSummary) bool { } if i.IP != j.IP { - return i.IP.String() < j.IP.String() + return i.IP.Less(j.IP) } if i.PublicPort != j.PublicPort { diff --git a/cli/command/formatter/container_test.go b/cli/command/formatter/container_test.go index 1c68aeaea059..6941d262013a 100644 --- a/cli/command/formatter/container_test.go +++ b/cli/command/formatter/container_test.go @@ -946,6 +946,24 @@ func TestDisplayablePorts(t *testing.T) { }, expected: "80/tcp, 80/udp, 1024/tcp, 1024/udp, 12345/sctp, 1.1.1.1:1024->80/tcp, 1.1.1.1:1024->80/udp, 2.1.1.1:1024->80/tcp, 2.1.1.1:1024->80/udp, 1.1.1.1:80->1024/tcp, 1.1.1.1:80->1024/udp, 2.1.1.1:80->1024/tcp, 2.1.1.1:80->1024/udp", //nolint:revive // ignore line-length-limit (revive) }, + { + // host IPs are ordered numerically, not lexicographically: + // "10.0.0.2" sorts as a string before "9.0.0.1". + ports: []container.PortSummary{ + { + IP: netip.MustParseAddr("10.0.0.2"), + PublicPort: 8080, + PrivatePort: 80, + Type: "tcp", + }, { + IP: netip.MustParseAddr("9.0.0.1"), + PublicPort: 8081, + PrivatePort: 80, + Type: "tcp", + }, + }, + expected: "9.0.0.1:8081->80/tcp, 10.0.0.2:8080->80/tcp", + }, } for _, port := range cases {