From 65640994fda8e1667de3642d8f4daf76dd3de302 Mon Sep 17 00:00:00 2001 From: Dan Walsh Date: Mon, 15 Sep 2014 15:43:21 -0400 Subject: [PATCH] Remove nameserver 127.0.0.1 line rather then dumping resolv.conf We have a bug report complaining about docker dumping the contents of the hosts resolv.conf if it container 127.0.0.1. They asked that instead of dropping the file altogether, that we just remove the line. This patch removes the 127.0.0.1 lines, if they exist and then checks if any nameserver lines exist. Docker-DCO-1.1-Signed-off-by: Dan Walsh (github: rhatdan) --- daemon/daemon.go | 1 + daemon/utils_test.go | 31 +++++++++++++++++++++++++++++++ utils/utils.go | 11 +++++++++++ 3 files changed, 43 insertions(+) diff --git a/daemon/daemon.go b/daemon/daemon.go index bf78f10670..7beb3182c8 100644 --- a/daemon/daemon.go +++ b/daemon/daemon.go @@ -1044,6 +1044,7 @@ func (daemon *Daemon) checkLocaldns() error { if err != nil { return err } + resolvConf = utils.RemoveLocalDns(resolvConf) if len(daemon.config.Dns) == 0 && utils.CheckLocalDns(resolvConf) { log.Infof("Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it. Using default external servers : %v", DefaultDns) daemon.config.Dns = DefaultDns diff --git a/daemon/utils_test.go b/daemon/utils_test.go index 1f3175b994..6ee75c8ece 100644 --- a/daemon/utils_test.go +++ b/daemon/utils_test.go @@ -27,3 +27,34 @@ func TestMergeLxcConfig(t *testing.T) { t.Fatalf("expected %s got %s", expected, cpuset) } } + +func TestRemoveLocalDns(t *testing.T) { + ns0 := "nameserver 10.16.60.14\nnameserver 10.16.60.21\n" + + if result := utils.RemoveLocalDns([]byte(ns0)); result != nil { + if ns0 != string(result) { + t.Fatalf("Failed No Localhost: expected \n<%s> got \n<%s>", ns0, string(result)) + } + } + + ns1 := "nameserver 10.16.60.14\nnameserver 10.16.60.21\nnameserver 127.0.0.1\n" + if result := utils.RemoveLocalDns([]byte(ns1)); result != nil { + if ns0 != string(result) { + t.Fatalf("Failed Localhost: expected \n<%s> got \n<%s>", ns0, string(result)) + } + } + + ns1 = "nameserver 10.16.60.14\nnameserver 127.0.0.1\nnameserver 10.16.60.21\n" + if result := utils.RemoveLocalDns([]byte(ns1)); result != nil { + if ns0 != string(result) { + t.Fatalf("Failed Localhost: expected \n<%s> got \n<%s>", ns0, string(result)) + } + } + + ns1 = "nameserver 127.0.1.1\nnameserver 10.16.60.14\nnameserver 10.16.60.21\n" + if result := utils.RemoveLocalDns([]byte(ns1)); result != nil { + if ns0 != string(result) { + t.Fatalf("Failed Localhost: expected \n<%s> got \n<%s>", ns0, string(result)) + } + } +} diff --git a/utils/utils.go b/utils/utils.go index eb2f31cecd..4785214557 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -13,6 +13,7 @@ import ( "os" "os/exec" "path/filepath" + "regexp" "runtime" "strconv" "strings" @@ -332,6 +333,16 @@ func CheckLocalDns(resolvConf []byte) bool { return true } +var ( + localHostRx = regexp.MustCompile(`(?m)^nameserver 127[^\n]+\n*`) +) + +// RemoveLocalDns looks into the /etc/resolv.conf, +// and removes any local nameserver entries. +func RemoveLocalDns(resolvConf []byte) []byte { + return localHostRx.ReplaceAll(resolvConf, []byte{}) +} + // GetLines parses input into lines and strips away comments. func GetLines(input []byte, commentMarker []byte) [][]byte { lines := bytes.Split(input, []byte("\n"))