diff --git a/daemon/daemon_unix.go b/daemon/daemon_unix.go index 10ad5f9794..a252b15f71 100644 --- a/daemon/daemon_unix.go +++ b/daemon/daemon_unix.go @@ -1000,6 +1000,9 @@ func initBridgeDriver(controller libnetwork.NetworkController, config *config.Co } 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 344a592c26..f9fe8855fe 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" ) @@ -416,3 +417,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 a9d9bc1fdf..54b60001a1 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) }