diff --git a/daemon/daemon_unix.go b/daemon/daemon_unix.go index 2d32d19a8e..3a1e46add7 100644 --- a/daemon/daemon_unix.go +++ b/daemon/daemon_unix.go @@ -997,6 +997,9 @@ func initBridgeDriver(controller *libnetwork.Controller, config *config.Config) } ipamV4Conf.SubPool = fCIDR.String() + if ipamV4Conf.PreferredPool == "" { + ipamV4Conf.PreferredPool = fCIDR.String() + } } if config.BridgeConfig.DefaultGatewayIPv4 != nil { diff --git a/integration/daemon/daemon_test.go b/integration/daemon/daemon_test.go index 2242d3d4f1..7ecb2c0aa4 100644 --- a/integration/daemon/daemon_test.go +++ b/integration/daemon/daemon_test.go @@ -21,6 +21,7 @@ import ( "github.com/docker/docker/testutil/daemon" "gotest.tools/v3/assert" is "gotest.tools/v3/assert/cmp" + "gotest.tools/v3/icmd" "gotest.tools/v3/skip" ) @@ -400,3 +401,30 @@ func testLiveRestoreVolumeReferences(t *testing.T) { runTest(t, "no") }) } + +func TestDaemonDefaultBridgeWithFixedCidrButNoBip(t *testing.T) { + skip.If(t, runtime.GOOS == "windows") + + bridgeName := "ext-bridge1" + d := daemon.New(t, daemon.WithEnvVars("DOCKER_TEST_CREATE_DEFAULT_BRIDGE="+bridgeName)) + defer func() { + d.Stop(t) + d.Cleanup(t) + }() + + defer func() { + // No need to clean up when running this test in rootless mode, as the + // interface is deleted when the daemon is stopped and the netns + // reclaimed by the kernel. + if !testEnv.IsRootless() { + deleteInterface(t, bridgeName) + } + }() + d.StartWithBusybox(t, "--bridge", bridgeName, "--fixed-cidr", "192.168.130.0/24") +} + +func deleteInterface(t *testing.T, ifName string) { + icmd.RunCommand("ip", "link", "delete", ifName).Assert(t, icmd.Success) + icmd.RunCommand("iptables", "-t", "nat", "--flush").Assert(t, icmd.Success) + icmd.RunCommand("iptables", "--flush").Assert(t, icmd.Success) +} diff --git a/libnetwork/drivers/bridge/setup_device.go b/libnetwork/drivers/bridge/setup_device.go index 73d8647b0e..974115603b 100644 --- a/libnetwork/drivers/bridge/setup_device.go +++ b/libnetwork/drivers/bridge/setup_device.go @@ -16,8 +16,14 @@ import ( // SetupDevice create a new bridge interface/ func setupDevice(config *networkConfiguration, i *bridgeInterface) error { // We only attempt to create the bridge when the requested device name is - // the default one. - if config.BridgeName != DefaultBridgeName && config.DefaultBridge { + // the default one. The default bridge name can be overridden with the + // DOCKER_TEST_CREATE_DEFAULT_BRIDGE env var. It should be used only for + // test purpose. + var defaultBridgeName string + if defaultBridgeName = os.Getenv("DOCKER_TEST_CREATE_DEFAULT_BRIDGE"); defaultBridgeName == "" { + defaultBridgeName = DefaultBridgeName + } + if config.BridgeName != defaultBridgeName && config.DefaultBridge { return NonDefaultBridgeExistError(config.BridgeName) }