diff --git a/daemon/network.go b/daemon/network.go index 8e4687e121..d9eea4e314 100644 --- a/daemon/network.go +++ b/daemon/network.go @@ -751,9 +751,13 @@ func buildIPAMResources(nw *libnetwork.Network) networktypes.IPAM { if info.IPAMData.Pool == nil { continue } + var gw string + if info.IPAMData.Gateway != nil { + gw = info.IPAMData.Gateway.IP.String() + } ipamConfig = append(ipamConfig, networktypes.IPAMConfig{ Subnet: info.IPAMData.Pool.String(), - Gateway: info.IPAMData.Gateway.String(), + Gateway: gw, }) } } diff --git a/integration/daemon/daemon_linux_test.go b/integration/daemon/daemon_linux_test.go index d3c79d37f5..da2c3d2412 100644 --- a/integration/daemon/daemon_linux_test.go +++ b/integration/daemon/daemon_linux_test.go @@ -57,7 +57,7 @@ func TestDaemonDefaultBridgeIPAM_Docker0(t *testing.T) { }, expIPAMConfig: []network.IPAMConfig{ {Subnet: "192.168.176.0/24", Gateway: "192.168.176.1"}, - {Subnet: "fdd1:8161:2d2c::/64", Gateway: "fdd1:8161:2d2c::1/64"}, + {Subnet: "fdd1:8161:2d2c::/64", Gateway: "fdd1:8161:2d2c::1"}, }, }, { diff --git a/integration/networking/bridge_linux_test.go b/integration/networking/bridge_linux_test.go index 1e084b92ec..bcf2750f3f 100644 --- a/integration/networking/bridge_linux_test.go +++ b/integration/networking/bridge_linux_test.go @@ -1542,3 +1542,21 @@ func TestAdvertiseAddresses(t *testing.T) { }) } } + +// TestNetworkInspectGateway checks that gateways reported in inspect output are parseable as addresses. +func TestNetworkInspectGateway(t *testing.T) { + ctx := setupTest(t) + c := testEnv.APIClient() + + const netName = "test-inspgw" + nid, err := network.Create(ctx, c, netName, network.WithIPv6()) + assert.NilError(t, err) + defer network.RemoveNoError(ctx, t, c, netName) + + insp, err := c.NetworkInspect(ctx, nid, networktypes.InspectOptions{}) + assert.NilError(t, err) + for _, ipamCfg := range insp.IPAM.Config { + _, err := netip.ParseAddr(ipamCfg.Gateway) + assert.Check(t, err) + } +}