diff --git a/daemon/container_unix.go b/daemon/container_unix.go index 729fb1520f..b35b1cbab5 100644 --- a/daemon/container_unix.go +++ b/daemon/container_unix.go @@ -611,7 +611,9 @@ func (container *Container) buildPortMapInfo(ep libnetwork.Endpoint, networkSett return networkSettings, nil } - networkSettings.Ports = nat.PortMap{} + if networkSettings.Ports == nil { + networkSettings.Ports = nat.PortMap{} + } if expData, ok := driverInfo[netlabel.ExposedPorts]; ok { if exposedPorts, ok := expData.([]types.TransportPort); ok { @@ -810,6 +812,17 @@ func (container *Container) buildCreateEndpointOptions(n libnetwork.Network) ([] createOptions []libnetwork.EndpointOption ) + if n.Name() == "bridge" || container.NetworkSettings.IsAnonymousEndpoint { + createOptions = append(createOptions, libnetwork.CreateOptionAnonymous()) + } + + // Other configs are applicable only for the endpoint in the network + // to which container was connected to on docker run. + if n.Name() != container.hostConfig.NetworkMode.NetworkName() && + !(n.Name() == "bridge" && container.hostConfig.NetworkMode.IsDefault()) { + return createOptions, nil + } + if container.Config.ExposedPorts != nil { portSpecs = container.Config.ExposedPorts } @@ -879,10 +892,6 @@ func (container *Container) buildCreateEndpointOptions(n libnetwork.Network) ([] createOptions = append(createOptions, libnetwork.EndpointOptionGeneric(genericOption)) } - if n.Name() == "bridge" || container.NetworkSettings.IsAnonymousEndpoint { - createOptions = append(createOptions, libnetwork.CreateOptionAnonymous()) - } - return createOptions, nil } diff --git a/integration-cli/docker_cli_network_unix_test.go b/integration-cli/docker_cli_network_unix_test.go index 4481380f28..909b07303c 100644 --- a/integration-cli/docker_cli_network_unix_test.go +++ b/integration-cli/docker_cli_network_unix_test.go @@ -525,6 +525,7 @@ func (s *DockerNetworkSuite) TestDockerNetworkAnonymousEndpoint(c *check.C) { testRequires(c, ExecSupport) hostsFile := "/etc/hosts" cstmBridgeNw := "custom-bridge-nw" + cstmBridgeNw1 := "custom-bridge-nw1" dockerCmd(c, "network", "create", "-d", "bridge", cstmBridgeNw) assertNwIsAvailable(c, cstmBridgeNw) @@ -548,6 +549,18 @@ func (s *DockerNetworkSuite) TestDockerNetworkAnonymousEndpoint(c *check.C) { c.Assert(string(hosts1), checker.Equals, string(hosts1post), check.Commentf("Unexpected %s change on anonymous container creation", hostsFile)) + // Connect the 2nd container to a new network and verify the + // first container /etc/hosts file still hasn't changed. + dockerCmd(c, "network", "create", "-d", "bridge", cstmBridgeNw1) + assertNwIsAvailable(c, cstmBridgeNw1) + + dockerCmd(c, "network", "connect", cstmBridgeNw1, cid2) + + hosts1post, err = readContainerFileWithExec(cid1, hostsFile) + c.Assert(err, checker.IsNil) + c.Assert(string(hosts1), checker.Equals, string(hosts1post), + check.Commentf("Unexpected %s change on container connect", hostsFile)) + // start a named container cName := "AnyName" out, _ = dockerCmd(c, "run", "-d", "--net", cstmBridgeNw, "--name", cName, "busybox", "top") @@ -782,3 +795,10 @@ func (s *DockerNetworkSuite) TestDockerNetworkDisconnectFromHost(c *check.C) { c.Assert(err, checker.NotNil, check.Commentf("Should err out disconnect from host")) c.Assert(out, checker.Contains, runconfig.ErrConflictHostNetwork.Error()) } + +func (s *DockerNetworkSuite) TestDockerNetworkConnectWithPortMapping(c *check.C) { + dockerCmd(c, "network", "create", "test1") + dockerCmd(c, "run", "-d", "--name", "c1", "-p", "5000:5000", "busybox", "top") + c.Assert(waitRun("c1"), check.IsNil) + dockerCmd(c, "network", "connect", "test1", "c1") +}