To make docker inspect return a consistent result of networksettings
for created container and stopped container, it's bettew to update
the network settings on container creating.
Signed-off-by: Lei Jitang <leijitang@huawei.com>
| ... | ... |
@@ -529,6 +529,29 @@ func (daemon *Daemon) updateNetwork(container *container.Container) error {
|
| 529 | 529 |
return nil |
| 530 | 530 |
} |
| 531 | 531 |
|
| 532 |
+// updateContainerNetworkSettings update the network settings |
|
| 533 |
+func (daemon *Daemon) updateContainerNetworkSettings(container *container.Container) error {
|
|
| 534 |
+ mode := container.HostConfig.NetworkMode |
|
| 535 |
+ if container.Config.NetworkDisabled || mode.IsContainer() {
|
|
| 536 |
+ return nil |
|
| 537 |
+ } |
|
| 538 |
+ |
|
| 539 |
+ networkName := mode.NetworkName() |
|
| 540 |
+ if mode.IsDefault() {
|
|
| 541 |
+ networkName = daemon.netController.Config().Daemon.DefaultNetwork |
|
| 542 |
+ } |
|
| 543 |
+ if mode.IsUserDefined() {
|
|
| 544 |
+ n, err := daemon.FindNetwork(networkName) |
|
| 545 |
+ if err != nil {
|
|
| 546 |
+ return err |
|
| 547 |
+ } |
|
| 548 |
+ networkName = n.Name() |
|
| 549 |
+ } |
|
| 550 |
+ container.NetworkSettings.Networks = make(map[string]*networktypes.EndpointSettings) |
|
| 551 |
+ container.NetworkSettings.Networks[networkName] = new(networktypes.EndpointSettings) |
|
| 552 |
+ return nil |
|
| 553 |
+} |
|
| 554 |
+ |
|
| 532 | 555 |
func (daemon *Daemon) allocateNetwork(container *container.Container) error {
|
| 533 | 556 |
controller := daemon.netController |
| 534 | 557 |
|
| ... | ... |
@@ -539,24 +562,14 @@ func (daemon *Daemon) allocateNetwork(container *container.Container) error {
|
| 539 | 539 |
|
| 540 | 540 |
updateSettings := false |
| 541 | 541 |
if len(container.NetworkSettings.Networks) == 0 {
|
| 542 |
- mode := container.HostConfig.NetworkMode |
|
| 543 |
- if container.Config.NetworkDisabled || mode.IsContainer() {
|
|
| 542 |
+ if container.Config.NetworkDisabled || container.HostConfig.NetworkMode.IsContainer() {
|
|
| 544 | 543 |
return nil |
| 545 | 544 |
} |
| 546 | 545 |
|
| 547 |
- networkName := mode.NetworkName() |
|
| 548 |
- if mode.IsDefault() {
|
|
| 549 |
- networkName = controller.Config().Daemon.DefaultNetwork |
|
| 550 |
- } |
|
| 551 |
- if mode.IsUserDefined() {
|
|
| 552 |
- n, err := daemon.FindNetwork(networkName) |
|
| 553 |
- if err != nil {
|
|
| 554 |
- return err |
|
| 555 |
- } |
|
| 556 |
- networkName = n.Name() |
|
| 546 |
+ err := daemon.updateContainerNetworkSettings(container) |
|
| 547 |
+ if err != nil {
|
|
| 548 |
+ return err |
|
| 557 | 549 |
} |
| 558 |
- container.NetworkSettings.Networks = make(map[string]*networktypes.EndpointSettings) |
|
| 559 |
- container.NetworkSettings.Networks[networkName] = new(networktypes.EndpointSettings) |
|
| 560 | 550 |
updateSettings = true |
| 561 | 551 |
} |
| 562 | 552 |
|
| ... | ... |
@@ -16,6 +16,11 @@ func (daemon *Daemon) setupLinkedContainers(container *container.Container) ([]s |
| 16 | 16 |
return nil, nil |
| 17 | 17 |
} |
| 18 | 18 |
|
| 19 |
+// updateContainerNetworkSettings update the network settings |
|
| 20 |
+func (daemon *Daemon) updateContainerNetworkSettings(container *container.Container) error {
|
|
| 21 |
+ return nil |
|
| 22 |
+} |
|
| 23 |
+ |
|
| 19 | 24 |
func (daemon *Daemon) initializeNetworking(container *container.Container) error {
|
| 20 | 25 |
return nil |
| 21 | 26 |
} |
| ... | ... |
@@ -106,6 +106,10 @@ func (daemon *Daemon) create(params *ContainerCreateConfig) (retC *container.Con |
| 106 | 106 |
return nil, err |
| 107 | 107 |
} |
| 108 | 108 |
|
| 109 |
+ if err := daemon.updateContainerNetworkSettings(container); err != nil {
|
|
| 110 |
+ return nil, err |
|
| 111 |
+ } |
|
| 112 |
+ |
|
| 109 | 113 |
if err := container.ToDiskLocking(); err != nil {
|
| 110 | 114 |
logrus.Errorf("Error saving new container to disk: %v", err)
|
| 111 | 115 |
return nil, err |
| ... | ... |
@@ -891,3 +891,22 @@ func (s *DockerNetworkSuite) TestDockerNetworkConnectWithMac(c *check.C) {
|
| 891 | 891 |
c.Assert(err, checker.IsNil) |
| 892 | 892 |
c.Assert(strings.TrimSpace(mac2), checker.Not(checker.Equals), strings.TrimSpace(mac1)) |
| 893 | 893 |
} |
| 894 |
+ |
|
| 895 |
+func (s *DockerNetworkSuite) TestDockerNetworkInspectCreatedContainer(c *check.C) {
|
|
| 896 |
+ dockerCmd(c, "create", "--name", "test", "busybox") |
|
| 897 |
+ networks, err := inspectField("test", "NetworkSettings.Networks")
|
|
| 898 |
+ c.Assert(err, checker.IsNil) |
|
| 899 |
+ c.Assert(networks, checker.Contains, "bridge", check.Commentf("Should return 'bridge' network"))
|
|
| 900 |
+} |
|
| 901 |
+ |
|
| 902 |
+func (s *DockerNetworkSuite) TestDockerNetworkRestartWithMulipleNetworks(c *check.C) {
|
|
| 903 |
+ dockerCmd(c, "network", "create", "test") |
|
| 904 |
+ dockerCmd(c, "run", "--name=foo", "-d", "busybox", "top") |
|
| 905 |
+ c.Assert(waitRun("foo"), checker.IsNil)
|
|
| 906 |
+ dockerCmd(c, "network", "connect", "test", "foo") |
|
| 907 |
+ dockerCmd(c, "restart", "foo") |
|
| 908 |
+ networks, err := inspectField("foo", "NetworkSettings.Networks")
|
|
| 909 |
+ c.Assert(err, checker.IsNil) |
|
| 910 |
+ c.Assert(networks, checker.Contains, "bridge", check.Commentf("Should contain 'bridge' network"))
|
|
| 911 |
+ c.Assert(networks, checker.Contains, "test", check.Commentf("Should contain 'test' netwokr"))
|
|
| 912 |
+} |