From 9ced509e6d89d1ab4e0c4b49485be7931b505354 Mon Sep 17 00:00:00 2001 From: Dan Walsh Date: Tue, 7 Oct 2014 16:04:06 -0400 Subject: [PATCH] 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 (github: rhatdan) --- daemon/container.go | 42 +++++++++++++++++++++++++++--------------- daemon/daemon.go | 19 ------------------- 2 files changed, 27 insertions(+), 34 deletions(-) diff --git a/daemon/container.go b/daemon/container.go index 221edaad2..d0fb77fae 100644 --- a/daemon/container.go +++ b/daemon/container.go @@ -1,6 +1,7 @@ package daemon import ( + "bytes" "encoding/json" "errors" "fmt" @@ -918,22 +919,33 @@ func (container *Container) setupContainerDns() error { return err } - if config.NetworkMode != "host" && (len(config.Dns) > 0 || len(daemon.config.Dns) > 0 || len(config.DnsSearch) > 0 || len(daemon.config.DnsSearch) > 0) { - var ( - dns = resolvconf.GetNameservers(resolvConf) - dnsSearch = resolvconf.GetSearchDomains(resolvConf) - ) - if len(config.Dns) > 0 { - dns = config.Dns - } else if len(daemon.config.Dns) > 0 { - dns = daemon.config.Dns + if config.NetworkMode != "host" { + if len(config.Dns) > 0 || len(daemon.config.Dns) > 0 || len(config.DnsSearch) > 0 || len(daemon.config.DnsSearch) > 0 { + var ( + dns = resolvconf.GetNameservers(resolvConf) + dnsSearch = resolvconf.GetSearchDomains(resolvConf) + ) + if len(config.Dns) > 0 { + dns = config.Dns + } else if len(daemon.config.Dns) > 0 { + dns = daemon.config.Dns + } + if len(config.DnsSearch) > 0 { + dnsSearch = config.DnsSearch + } else if len(daemon.config.DnsSearch) > 0 { + dnsSearch = daemon.config.DnsSearch + } + return resolvconf.Build(container.ResolvConfPath, dns, dnsSearch) + } else { + resolvConf = utils.RemoveLocalDns(resolvConf) + if !bytes.Contains(resolvConf, []byte("nameserver")) { + for _, dns := range DefaultDns { + log.Infof("No non localhost DNS resolver found in resolv.conf and containers can't use it. Using default external servers : %v", DefaultDns) + resolvConf = append(append(resolvConf, []byte("\nnameserver ")...), dns...) + } + resolvConf = append(resolvConf, []byte("\n")...) + } } - if len(config.DnsSearch) > 0 { - dnsSearch = config.DnsSearch - } else if len(daemon.config.DnsSearch) > 0 { - dnsSearch = daemon.config.DnsSearch - } - return resolvconf.Build(container.ResolvConfPath, dns, dnsSearch) } return ioutil.WriteFile(container.ResolvConfPath, resolvConf, 0644) } diff --git a/daemon/daemon.go b/daemon/daemon.go index 1757b4fea..8d8fd3d30 100644 --- a/daemon/daemon.go +++ b/daemon/daemon.go @@ -1,7 +1,6 @@ package daemon import ( - "bytes" "fmt" "io" "io/ioutil" @@ -32,7 +31,6 @@ import ( "github.com/docker/docker/pkg/ioutils" "github.com/docker/docker/pkg/log" "github.com/docker/docker/pkg/namesgenerator" - "github.com/docker/docker/pkg/networkfs/resolvconf" "github.com/docker/docker/pkg/parsers" "github.com/docker/docker/pkg/parsers/kernel" "github.com/docker/docker/pkg/sysinfo" @@ -925,9 +923,6 @@ func NewDaemonFromDirectory(config *Config, eng *engine.Engine) (*Daemon, error) eng: eng, trustStore: t, } - if err := daemon.checkLocaldns(); err != nil { - return nil, err - } if err := daemon.restore(); err != nil { return nil, err } @@ -1087,20 +1082,6 @@ func (daemon *Daemon) ContainerGraph() *graphdb.Database { return daemon.containerGraph } -func (daemon *Daemon) checkLocaldns() error { - resolvConf, err := resolvconf.Get() - if err != nil { - return err - } - resolvConf = utils.RemoveLocalDns(resolvConf) - - if len(daemon.config.Dns) == 0 && !bytes.Contains(resolvConf, []byte("nameserver")) { - log.Infof("No non localhost DNS resolver found in resolv.conf and containers can't use it. Using default external servers : %v", DefaultDns) - daemon.config.Dns = DefaultDns - } - return nil -} - func (daemon *Daemon) ImageGetCached(imgID string, config *runconfig.Config) (*image.Image, error) { // Retrieve all images images, err := daemon.Graph().Map()