diff --git a/daemon/container_operations_unix.go b/daemon/container_operations_unix.go index ed84ce2930..8df163d0a5 100644 --- a/daemon/container_operations_unix.go +++ b/daemon/container_operations_unix.go @@ -658,6 +658,9 @@ func hasUserDefinedIPAddress(epConfig *networktypes.EndpointSettings) bool { // User specified ip address is acceptable only for networks with user specified subnets. func validateNetworkingConfig(n libnetwork.Network, epConfig *networktypes.EndpointSettings) error { + if n == nil || epConfig == nil { + return nil + } if !hasUserDefinedIPAddress(epConfig) { return nil } @@ -704,7 +707,7 @@ func cleanOperationalData(es *networktypes.EndpointSettings) { es.MacAddress = "" } -func (daemon *Daemon) updateNetworkConfig(container *container.Container, idOrName string, updateSettings bool) (libnetwork.Network, error) { +func (daemon *Daemon) updateNetworkConfig(container *container.Container, idOrName string, endpointConfig *networktypes.EndpointSettings, updateSettings bool) (libnetwork.Network, error) { if container.HostConfig.NetworkMode.IsContainer() { return nil, runconfig.ErrConflictSharedNetwork } @@ -715,11 +718,24 @@ func (daemon *Daemon) updateNetworkConfig(container *container.Container, idOrNa return nil, nil } + if !containertypes.NetworkMode(idOrName).IsUserDefined() { + if hasUserDefinedIPAddress(endpointConfig) { + return nil, runconfig.ErrUnsupportedNetworkAndIP + } + if endpointConfig != nil && len(endpointConfig.Aliases) > 0 { + return nil, runconfig.ErrUnsupportedNetworkAndAlias + } + } + n, err := daemon.FindNetwork(idOrName) if err != nil { return nil, err } + if err := validateNetworkingConfig(n, endpointConfig); err != nil { + return nil, err + } + if updateSettings { if err := daemon.updateNetworkSettings(container, n); err != nil { return nil, err @@ -734,7 +750,7 @@ func (daemon *Daemon) ConnectToNetwork(container *container.Container, idOrName if container.RemovalInProgress || container.Dead { return derr.ErrorCodeRemovalContainer.WithArgs(container.ID) } - if _, err := daemon.updateNetworkConfig(container, idOrName, true); err != nil { + if _, err := daemon.updateNetworkConfig(container, idOrName, endpointConfig, true); err != nil { return err } } else { @@ -749,7 +765,7 @@ func (daemon *Daemon) ConnectToNetwork(container *container.Container, idOrName } func (daemon *Daemon) connectToNetwork(container *container.Container, idOrName string, endpointConfig *networktypes.EndpointSettings, updateSettings bool) (err error) { - n, err := daemon.updateNetworkConfig(container, idOrName, updateSettings) + n, err := daemon.updateNetworkConfig(container, idOrName, endpointConfig, updateSettings) if err != nil { return err } @@ -760,17 +776,6 @@ func (daemon *Daemon) connectToNetwork(container *container.Container, idOrName controller := daemon.netController if endpointConfig != nil { - if !containertypes.NetworkMode(idOrName).IsUserDefined() && hasUserDefinedIPAddress(endpointConfig) { - return runconfig.ErrUnsupportedNetworkAndIP - } - - if err := validateNetworkingConfig(n, endpointConfig); err != nil { - return err - } - - if !containertypes.NetworkMode(idOrName).IsUserDefined() && len(endpointConfig.Aliases) > 0 { - return runconfig.ErrUnsupportedNetworkAndAlias - } container.NetworkSettings.Networks[n.Name()] = endpointConfig } diff --git a/integration-cli/docker_cli_network_unix_test.go b/integration-cli/docker_cli_network_unix_test.go index d0e35ab935..ca46a05dfc 100644 --- a/integration-cli/docker_cli_network_unix_test.go +++ b/integration-cli/docker_cli_network_unix_test.go @@ -1146,7 +1146,7 @@ func (s *DockerNetworkSuite) TestDockerNetworkConnectPreferredIP(c *check.C) { func (s *DockerNetworkSuite) TestDockerNetworkUnsupportedPreferredIP(c *check.C) { // preferred IP is not supported on predefined networks - for _, mode := range []string{"none", "host", "bridge"} { + for _, mode := range []string{"none", "host", "bridge", "default"} { checkUnsupportedNetworkAndIP(c, mode) } @@ -1299,4 +1299,14 @@ func (s *DockerSuite) TestUserDefinedNetworkConnectDisconnectAlias(c *check.C) { // ping to net2 scoped alias "bar" must still succeed _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "bar") c.Assert(err, check.IsNil) + + // verify the alias option is rejected when running on predefined network + out, _, err := dockerCmdWithError("run", "--rm", "--name=any", "--net-alias=any", "busybox", "top") + c.Assert(err, checker.NotNil, check.Commentf("out: %s", out)) + c.Assert(out, checker.Contains, runconfig.ErrUnsupportedNetworkAndAlias.Error()) + + // verify the alias option is rejected when connecting to predefined network + out, _, err = dockerCmdWithError("network", "connect", "--alias=any", "bridge", "first") + c.Assert(err, checker.NotNil, check.Commentf("out: %s", out)) + c.Assert(out, checker.Contains, runconfig.ErrUnsupportedNetworkAndAlias.Error()) } diff --git a/runconfig/opts/parse.go b/runconfig/opts/parse.go index f716022620..41cb377ae9 100644 --- a/runconfig/opts/parse.go +++ b/runconfig/opts/parse.go @@ -442,7 +442,7 @@ func Parse(cmd *flag.FlagSet, args []string) (*container.Config, *container.Host networkingConfig.EndpointsConfig[string(hostConfig.NetworkMode)] = epConfig } - if hostConfig.NetworkMode.IsUserDefined() && flAliases.Len() > 0 { + if flAliases.Len() > 0 { epConfig := networkingConfig.EndpointsConfig[string(hostConfig.NetworkMode)] if epConfig == nil { epConfig = &networktypes.EndpointSettings{}