Browse code

Check /etc/resolv.conf every time for 127.* content

Currently if you start the docker -d on a system with 127.0.0.1 in /etc/resolv.conf
It will set the default dns to 8.8.8.8 8.8.4.4 permanently.

This causes a problem at boot on Fedora machines where NetworkManager has not
populated /etc/resolv.conf before docker gets started.

This fix checks /etc/resolv.conf on every docker run. And only populates
daemon.config.Dns if the user specified it on the command line.

Docker-DCO-1.1-Signed-off-by: Dan Walsh <dwalsh@redhat.com> (github: rhatdan)

Dan Walsh authored on 2014/10/08 05:04:06
Showing 2 changed files
... ...
@@ -1,6 +1,7 @@
1 1
 package daemon
2 2
 
3 3
 import (
4
+	"bytes"
4 5
 	"encoding/json"
5 6
 	"errors"
6 7
 	"fmt"
... ...
@@ -918,22 +919,33 @@ func (container *Container) setupContainerDns() error {
918 918
 		return err
919 919
 	}
920 920
 
921
-	if config.NetworkMode != "host" && (len(config.Dns) > 0 || len(daemon.config.Dns) > 0 || len(config.DnsSearch) > 0 || len(daemon.config.DnsSearch) > 0) {
922
-		var (
923
-			dns       = resolvconf.GetNameservers(resolvConf)
924
-			dnsSearch = resolvconf.GetSearchDomains(resolvConf)
925
-		)
926
-		if len(config.Dns) > 0 {
927
-			dns = config.Dns
928
-		} else if len(daemon.config.Dns) > 0 {
929
-			dns = daemon.config.Dns
930
-		}
931
-		if len(config.DnsSearch) > 0 {
932
-			dnsSearch = config.DnsSearch
933
-		} else if len(daemon.config.DnsSearch) > 0 {
934
-			dnsSearch = daemon.config.DnsSearch
921
+	if config.NetworkMode != "host" {
922
+		if len(config.Dns) > 0 || len(daemon.config.Dns) > 0 || len(config.DnsSearch) > 0 || len(daemon.config.DnsSearch) > 0 {
923
+			var (
924
+				dns       = resolvconf.GetNameservers(resolvConf)
925
+				dnsSearch = resolvconf.GetSearchDomains(resolvConf)
926
+			)
927
+			if len(config.Dns) > 0 {
928
+				dns = config.Dns
929
+			} else if len(daemon.config.Dns) > 0 {
930
+				dns = daemon.config.Dns
931
+			}
932
+			if len(config.DnsSearch) > 0 {
933
+				dnsSearch = config.DnsSearch
934
+			} else if len(daemon.config.DnsSearch) > 0 {
935
+				dnsSearch = daemon.config.DnsSearch
936
+			}
937
+			return resolvconf.Build(container.ResolvConfPath, dns, dnsSearch)
938
+		} else {
939
+			resolvConf = utils.RemoveLocalDns(resolvConf)
940
+			if !bytes.Contains(resolvConf, []byte("nameserver")) {
941
+				for _, dns := range DefaultDns {
942
+					log.Infof("No non localhost DNS resolver found in resolv.conf and containers can't use it. Using default external servers : %v", DefaultDns)
943
+					resolvConf = append(append(resolvConf, []byte("\nnameserver ")...), dns...)
944
+				}
945
+				resolvConf = append(resolvConf, []byte("\n")...)
946
+			}
935 947
 		}
936
-		return resolvconf.Build(container.ResolvConfPath, dns, dnsSearch)
937 948
 	}
938 949
 	return ioutil.WriteFile(container.ResolvConfPath, resolvConf, 0644)
939 950
 }
... ...
@@ -1,7 +1,6 @@
1 1
 package daemon
2 2
 
3 3
 import (
4
-	"bytes"
5 4
 	"fmt"
6 5
 	"io"
7 6
 	"io/ioutil"
... ...
@@ -32,7 +31,6 @@ import (
32 32
 	"github.com/docker/docker/pkg/ioutils"
33 33
 	"github.com/docker/docker/pkg/log"
34 34
 	"github.com/docker/docker/pkg/namesgenerator"
35
-	"github.com/docker/docker/pkg/networkfs/resolvconf"
36 35
 	"github.com/docker/docker/pkg/parsers"
37 36
 	"github.com/docker/docker/pkg/parsers/kernel"
38 37
 	"github.com/docker/docker/pkg/sysinfo"
... ...
@@ -925,9 +923,6 @@ func NewDaemonFromDirectory(config *Config, eng *engine.Engine) (*Daemon, error)
925 925
 		eng:            eng,
926 926
 		trustStore:     t,
927 927
 	}
928
-	if err := daemon.checkLocaldns(); err != nil {
929
-		return nil, err
930
-	}
931 928
 	if err := daemon.restore(); err != nil {
932 929
 		return nil, err
933 930
 	}
... ...
@@ -1087,20 +1082,6 @@ func (daemon *Daemon) ContainerGraph() *graphdb.Database {
1087 1087
 	return daemon.containerGraph
1088 1088
 }
1089 1089
 
1090
-func (daemon *Daemon) checkLocaldns() error {
1091
-	resolvConf, err := resolvconf.Get()
1092
-	if err != nil {
1093
-		return err
1094
-	}
1095
-	resolvConf = utils.RemoveLocalDns(resolvConf)
1096
-
1097
-	if len(daemon.config.Dns) == 0 && !bytes.Contains(resolvConf, []byte("nameserver")) {
1098
-		log.Infof("No non localhost DNS resolver found in resolv.conf and containers can't use it. Using default external servers : %v", DefaultDns)
1099
-		daemon.config.Dns = DefaultDns
1100
-	}
1101
-	return nil
1102
-}
1103
-
1104 1090
 func (daemon *Daemon) ImageGetCached(imgID string, config *runconfig.Config) (*image.Image, error) {
1105 1091
 	// Retrieve all images
1106 1092
 	images, err := daemon.Graph().Map()