Kaynağa Gözat

Merge pull request #18318 from calavera/fix_dns_setting_on_hostconfig_start

Make sure container start doesn't make the DNS fields nil.
Tibor Vass 9 yıl önce
ebeveyn
işleme
c247b3d104

+ 23 - 16
daemon/container.go

@@ -166,22 +166,7 @@ func (container *Container) readHostConfig() error {
 		return err
 		return err
 	}
 	}
 
 
-	// Make sure the dns fields are never nil.
-	// New containers don't ever have those fields nil,
-	// but pre created containers can still have those nil values.
-	// See https://github.com/docker/docker/pull/17779
-	// for a more detailed explanation on why we don't want that.
-	if container.hostConfig.DNS == nil {
-		container.hostConfig.DNS = make([]string, 0)
-	}
-
-	if container.hostConfig.DNSSearch == nil {
-		container.hostConfig.DNSSearch = make([]string, 0)
-	}
-
-	if container.hostConfig.DNSOptions == nil {
-		container.hostConfig.DNSOptions = make([]string, 0)
-	}
+	initDNSHostConfig(container)
 
 
 	return nil
 	return nil
 }
 }
@@ -543,3 +528,25 @@ func (container *Container) stopSignal() int {
 	}
 	}
 	return int(stopSignal)
 	return int(stopSignal)
 }
 }
+
+// initDNSHostConfig ensures that the dns fields are never nil.
+// New containers don't ever have those fields nil,
+// but pre created containers can still have those nil values.
+// The non-recommended host configuration in the start api can
+// make these fields nil again, this corrects that issue until
+// we remove that behavior for good.
+// See https://github.com/docker/docker/pull/17779
+// for a more detailed explanation on why we don't want that.
+func initDNSHostConfig(container *Container) {
+	if container.hostConfig.DNS == nil {
+		container.hostConfig.DNS = make([]string, 0)
+	}
+
+	if container.hostConfig.DNSSearch == nil {
+		container.hostConfig.DNSSearch = make([]string, 0)
+	}
+
+	if container.hostConfig.DNSOptions == nil {
+		container.hostConfig.DNSOptions = make([]string, 0)
+	}
+}

+ 2 - 0
daemon/start.go

@@ -29,6 +29,7 @@ func (daemon *Daemon) ContainerStart(name string, hostConfig *runconfig.HostConf
 		// This is kept for backward compatibility - hostconfig should be passed when
 		// This is kept for backward compatibility - hostconfig should be passed when
 		// creating a container, not during start.
 		// creating a container, not during start.
 		if hostConfig != nil {
 		if hostConfig != nil {
+			logrus.Warn("DEPRECATED: Setting host configuration options when the container starts is deprecated and will be removed in Docker 1.12")
 			container.Lock()
 			container.Lock()
 			if err := parseSecurityOpt(container, hostConfig); err != nil {
 			if err := parseSecurityOpt(container, hostConfig); err != nil {
 				container.Unlock()
 				container.Unlock()
@@ -38,6 +39,7 @@ func (daemon *Daemon) ContainerStart(name string, hostConfig *runconfig.HostConf
 			if err := daemon.setHostConfig(container, hostConfig); err != nil {
 			if err := daemon.setHostConfig(container, hostConfig); err != nil {
 				return err
 				return err
 			}
 			}
+			initDNSHostConfig(container)
 		}
 		}
 	} else {
 	} else {
 		if hostConfig != nil {
 		if hostConfig != nil {

+ 17 - 0
integration-cli/docker_api_containers_test.go

@@ -1371,3 +1371,20 @@ func (s *DockerSuite) TestPostContainersCreateWithWrongCpusetValues(c *check.C)
 	expected = "Invalid value 42-3,1-- for cpuset mems.\n"
 	expected = "Invalid value 42-3,1-- for cpuset mems.\n"
 	c.Assert(string(body), checker.Equals, expected)
 	c.Assert(string(body), checker.Equals, expected)
 }
 }
+
+func (s *DockerSuite) TestStartWithNilDNS(c *check.C) {
+	testRequires(c, DaemonIsLinux)
+	out, _ := dockerCmd(c, "create", "busybox")
+	containerID := strings.TrimSpace(out)
+
+	config := `{"HostConfig": {"Dns": null}}`
+
+	res, b, err := sockRequestRaw("POST", "/containers/"+containerID+"/start", strings.NewReader(config), "application/json")
+	c.Assert(err, checker.IsNil)
+	c.Assert(res.StatusCode, checker.Equals, http.StatusNoContent)
+	b.Close()
+
+	dns, err := inspectFieldJSON(containerID, "HostConfig.Dns")
+	c.Assert(err, checker.IsNil)
+	c.Assert(dns, checker.Equals, "[]")
+}