libnetwork host, none and bridge driver initialization is incorrectly
disabled if the daemon flag --bridge=none. The expected behavior of
setting --bridge as none is to disable the bridge driver alone and let
all other modes to be operational.
Signed-off-by: Madhu Venugopal <madhu@docker.com>
... | ... |
@@ -469,7 +469,7 @@ func (container *Container) buildJoinOptions() ([]libnetwork.EndpointOption, err |
469 | 469 |
logrus.Error(err) |
470 | 470 |
} |
471 | 471 |
|
472 |
- if c != nil && !container.daemon.config.DisableNetwork && container.hostConfig.NetworkMode.IsPrivate() { |
|
472 |
+ if c != nil && !container.daemon.config.DisableBridge && container.hostConfig.NetworkMode.IsPrivate() { |
|
473 | 473 |
logrus.Debugf("Update /etc/hosts of %s for alias %s with ip %s", c.ID, ref.Name, container.NetworkSettings.IPAddress) |
474 | 474 |
joinOptions = append(joinOptions, libnetwork.JoinOptionParentUpdate(c.NetworkSettings.EndpointID, ref.Name, container.NetworkSettings.IPAddress)) |
475 | 475 |
if c.NetworkSettings.EndpointID != "" { |
... | ... |
@@ -773,6 +773,11 @@ func (container *Container) secondaryNetworkRequired(primaryNetworkType string) |
773 | 773 |
case "bridge", "none", "host", "container": |
774 | 774 |
return false |
775 | 775 |
} |
776 |
+ |
|
777 |
+ if container.daemon.config.DisableBridge { |
|
778 |
+ return false |
|
779 |
+ } |
|
780 |
+ |
|
776 | 781 |
if container.Config.ExposedPorts != nil && len(container.Config.ExposedPorts) > 0 { |
777 | 782 |
return true |
778 | 783 |
} |
... | ... |
@@ -803,6 +808,11 @@ func (container *Container) AllocateNetwork() error { |
803 | 803 |
return fmt.Errorf("conflicting options: publishing a service and network mode") |
804 | 804 |
} |
805 | 805 |
|
806 |
+ if runconfig.NetworkMode(networkDriver).IsBridge() && container.daemon.config.DisableBridge { |
|
807 |
+ container.Config.NetworkDisabled = true |
|
808 |
+ return nil |
|
809 |
+ } |
|
810 |
+ |
|
806 | 811 |
if service == "" { |
807 | 812 |
// dot character "." has a special meaning to support SERVICE[.NETWORK] format. |
808 | 813 |
// For backward compatiblity, replacing "." with "-", instead of failing |
... | ... |
@@ -897,10 +907,6 @@ func (container *Container) initializeNetworking() error { |
897 | 897 |
return nil |
898 | 898 |
} |
899 | 899 |
|
900 |
- if container.daemon.config.DisableNetwork { |
|
901 |
- container.Config.NetworkDisabled = true |
|
902 |
- } |
|
903 |
- |
|
904 | 900 |
if container.hostConfig.NetworkMode.IsHost() { |
905 | 901 |
container.Config.Hostname, err = os.Hostname() |
906 | 902 |
if err != nil { |
... | ... |
@@ -999,7 +1005,7 @@ func (container *Container) getNetworkedContainer() (*Container, error) { |
999 | 999 |
} |
1000 | 1000 |
|
1001 | 1001 |
func (container *Container) ReleaseNetwork() { |
1002 |
- if container.hostConfig.NetworkMode.IsContainer() || container.daemon.config.DisableNetwork { |
|
1002 |
+ if container.hostConfig.NetworkMode.IsContainer() || container.Config.NetworkDisabled { |
|
1003 | 1003 |
return |
1004 | 1004 |
} |
1005 | 1005 |
|
... | ... |
@@ -561,7 +561,7 @@ func NewDaemon(config *Config, registryService *registry.Service) (daemon *Daemo |
561 | 561 |
} |
562 | 562 |
|
563 | 563 |
// Do we have a disabled network? |
564 |
- config.DisableNetwork = isNetworkDisabled(config) |
|
564 |
+ config.DisableBridge = isBridgeNetworkDisabled(config) |
|
565 | 565 |
|
566 | 566 |
// Check that the system is supported and we have sufficient privileges |
567 | 567 |
if err := checkSystem(); err != nil { |
... | ... |
@@ -684,11 +684,9 @@ func NewDaemon(config *Config, registryService *registry.Service) (daemon *Daemo |
684 | 684 |
return nil, fmt.Errorf("Couldn't create Tag store: %s", err) |
685 | 685 |
} |
686 | 686 |
|
687 |
- if !config.DisableNetwork { |
|
688 |
- d.netController, err = initNetworkController(config) |
|
689 |
- if err != nil { |
|
690 |
- return nil, fmt.Errorf("Error initializing network controller: %v", err) |
|
691 |
- } |
|
687 |
+ d.netController, err = initNetworkController(config) |
|
688 |
+ if err != nil { |
|
689 |
+ return nil, fmt.Errorf("Error initializing network controller: %v", err) |
|
692 | 690 |
} |
693 | 691 |
|
694 | 692 |
graphdbPath := filepath.Join(config.Root, "linkgraph.db") |
... | ... |
@@ -261,7 +261,7 @@ func configureSysInit(config *Config) (string, error) { |
261 | 261 |
return sysInitPath, nil |
262 | 262 |
} |
263 | 263 |
|
264 |
-func isNetworkDisabled(config *Config) bool { |
|
264 |
+func isBridgeNetworkDisabled(config *Config) bool { |
|
265 | 265 |
return config.Bridge.Iface == disableNetworkBridge |
266 | 266 |
} |
267 | 267 |
|
... | ... |
@@ -329,12 +329,22 @@ func initNetworkController(config *Config) (libnetwork.NetworkController, error) |
329 | 329 |
return nil, fmt.Errorf("Error creating default \"host\" network: %v", err) |
330 | 330 |
} |
331 | 331 |
|
332 |
- // Initialize default driver "bridge" |
|
332 |
+ if !config.DisableBridge { |
|
333 |
+ // Initialize default driver "bridge" |
|
334 |
+ if err := initBridgeDriver(controller, config); err != nil { |
|
335 |
+ return nil, err |
|
336 |
+ } |
|
337 |
+ } |
|
338 |
+ |
|
339 |
+ return controller, nil |
|
340 |
+} |
|
341 |
+ |
|
342 |
+func initBridgeDriver(controller libnetwork.NetworkController, config *Config) error { |
|
333 | 343 |
option := options.Generic{ |
334 | 344 |
"EnableIPForwarding": config.Bridge.EnableIPForward} |
335 | 345 |
|
336 | 346 |
if err := controller.ConfigureNetworkDriver("bridge", options.Generic{netlabel.GenericData: option}); err != nil { |
337 |
- return nil, fmt.Errorf("Error initializing bridge driver: %v", err) |
|
347 |
+ return fmt.Errorf("Error initializing bridge driver: %v", err) |
|
338 | 348 |
} |
339 | 349 |
|
340 | 350 |
netOption := options.Generic{ |
... | ... |
@@ -349,7 +359,7 @@ func initNetworkController(config *Config) (libnetwork.NetworkController, error) |
349 | 349 |
if config.Bridge.IP != "" { |
350 | 350 |
ip, bipNet, err := net.ParseCIDR(config.Bridge.IP) |
351 | 351 |
if err != nil { |
352 |
- return nil, err |
|
352 |
+ return err |
|
353 | 353 |
} |
354 | 354 |
|
355 | 355 |
bipNet.IP = ip |
... | ... |
@@ -359,7 +369,7 @@ func initNetworkController(config *Config) (libnetwork.NetworkController, error) |
359 | 359 |
if config.Bridge.FixedCIDR != "" { |
360 | 360 |
_, fCIDR, err := net.ParseCIDR(config.Bridge.FixedCIDR) |
361 | 361 |
if err != nil { |
362 |
- return nil, err |
|
362 |
+ return err |
|
363 | 363 |
} |
364 | 364 |
|
365 | 365 |
netOption["FixedCIDR"] = fCIDR |
... | ... |
@@ -368,7 +378,7 @@ func initNetworkController(config *Config) (libnetwork.NetworkController, error) |
368 | 368 |
if config.Bridge.FixedCIDRv6 != "" { |
369 | 369 |
_, fCIDRv6, err := net.ParseCIDR(config.Bridge.FixedCIDRv6) |
370 | 370 |
if err != nil { |
371 |
- return nil, err |
|
371 |
+ return err |
|
372 | 372 |
} |
373 | 373 |
|
374 | 374 |
netOption["FixedCIDRv6"] = fCIDRv6 |
... | ... |
@@ -388,16 +398,15 @@ func initNetworkController(config *Config) (libnetwork.NetworkController, error) |
388 | 388 |
} |
389 | 389 |
|
390 | 390 |
// Initialize default network on "bridge" with the same name |
391 |
- _, err = controller.NewNetwork("bridge", "bridge", |
|
391 |
+ _, err := controller.NewNetwork("bridge", "bridge", |
|
392 | 392 |
libnetwork.NetworkOptionGeneric(options.Generic{ |
393 | 393 |
netlabel.GenericData: netOption, |
394 | 394 |
netlabel.EnableIPv6: config.Bridge.EnableIPv6, |
395 | 395 |
})) |
396 | 396 |
if err != nil { |
397 |
- return nil, fmt.Errorf("Error creating default \"bridge\" network: %v", err) |
|
397 |
+ return fmt.Errorf("Error creating default \"bridge\" network: %v", err) |
|
398 | 398 |
} |
399 |
- |
|
400 |
- return controller, nil |
|
399 |
+ return nil |
|
401 | 400 |
} |
402 | 401 |
|
403 | 402 |
// setupInitLayer populates a directory with mountpoints suitable |
... | ... |
@@ -1207,7 +1207,17 @@ func (s *DockerDaemonSuite) TestRunContainerWithBridgeNone(c *check.C) { |
1207 | 1207 |
out, err := s.d.Cmd("run", "--rm", "busybox", "ip", "l") |
1208 | 1208 |
c.Assert(err, check.IsNil, check.Commentf("Output: %s", out)) |
1209 | 1209 |
c.Assert(strings.Contains(out, "eth0"), check.Equals, false, |
1210 |
- check.Commentf("There shouldn't be eth0 in container when network is disabled: %s", out)) |
|
1210 |
+ check.Commentf("There shouldn't be eth0 in container in default(bridge) mode when bridge network is disabled: %s", out)) |
|
1211 |
+ |
|
1212 |
+ out, err = s.d.Cmd("run", "--rm", "--net=bridge", "busybox", "ip", "l") |
|
1213 |
+ c.Assert(err, check.IsNil, check.Commentf("Output: %s", out)) |
|
1214 |
+ c.Assert(strings.Contains(out, "eth0"), check.Equals, false, |
|
1215 |
+ check.Commentf("There shouldn't be eth0 in container in bridge mode when bridge network is disabled: %s", out)) |
|
1216 |
+ |
|
1217 |
+ out, err = s.d.Cmd("run", "--rm", "--net=host", "busybox", "ip", "l") |
|
1218 |
+ c.Assert(err, check.IsNil, check.Commentf("Output: %s", out)) |
|
1219 |
+ c.Assert(strings.Contains(out, "eth0"), check.Equals, true, |
|
1220 |
+ check.Commentf("There should be eth0 in container when --net=host when bridge network is disabled: %s", out)) |
|
1211 | 1221 |
} |
1212 | 1222 |
|
1213 | 1223 |
func (s *DockerDaemonSuite) TestDaemonRestartWithContainerRunning(t *check.C) { |