feat: allow to bind to multiple host IP addresses specified as CIDR prefix in x-ports (#358)

Signed-off-by: Miek Gieben <miek@miek.nl>
Co-authored-by: Pasha Sviderski <me@psviderski.name>
This commit is contained in:
Miek Gieben
2026-06-04 20:07:58 +10:00
committed by GitHub
co-authored by Pasha Sviderski
parent 3586a32987
commit 1247f961c2
11 changed files with 312 additions and 76 deletions
+34
View File
@@ -0,0 +1,34 @@
package docker
import (
"fmt"
"net"
"net/netip"
)
// addrOfPrefix checks the interfaces and returns the address of each interface that was contained in the prefix.
func addrOfPrefix(prefix netip.Prefix) ([]string, error) {
ifis, err := net.Interfaces()
if err != nil {
return nil, err
}
var addrs []string
for _, ifi := range ifis {
ifaddrs, _ := ifi.Addrs()
for _, addr := range ifaddrs {
ipnet, ok := addr.(*net.IPNet)
if !ok {
continue
}
nip, _ := netip.ParseAddr(ipnet.IP.String()) // round about way is needed to get ipv6 addrs, not mapped v4 in v6.
if prefix.Contains(nip) {
addrs = append(addrs, nip.String())
}
}
}
if len(addrs) == 0 {
return nil, fmt.Errorf("no host addresses are contained in prefix '%s'", prefix)
}
return addrs, nil
}