Browse Source

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 <dwalsh@redhat.com> (github: rhatdan)
Dan Walsh 11 năm trước cách đây
mục cha
commit
65640994fd
3 tập tin đã thay đổi với 43 bổ sung0 xóa
  1. 1 0
      daemon/daemon.go
  2. 31 0
      daemon/utils_test.go
  3. 11 0
      utils/utils.go

+ 1 - 0
daemon/daemon.go

@@ -1044,6 +1044,7 @@ func (daemon *Daemon) checkLocaldns() error {
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
+	resolvConf = utils.RemoveLocalDns(resolvConf)
 	if len(daemon.config.Dns) == 0 && utils.CheckLocalDns(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)
 		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
 		daemon.config.Dns = DefaultDns

+ 31 - 0
daemon/utils_test.go

@@ -27,3 +27,34 @@ func TestMergeLxcConfig(t *testing.T) {
 		t.Fatalf("expected %s got %s", expected, cpuset)
 		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))
+		}
+	}
+}

+ 11 - 0
utils/utils.go

@@ -13,6 +13,7 @@ import (
 	"os"
 	"os"
 	"os/exec"
 	"os/exec"
 	"path/filepath"
 	"path/filepath"
+	"regexp"
 	"runtime"
 	"runtime"
 	"strconv"
 	"strconv"
 	"strings"
 	"strings"
@@ -332,6 +333,16 @@ func CheckLocalDns(resolvConf []byte) bool {
 	return true
 	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.
 // GetLines parses input into lines and strips away comments.
 func GetLines(input []byte, commentMarker []byte) [][]byte {
 func GetLines(input []byte, commentMarker []byte) [][]byte {
 	lines := bytes.Split(input, []byte("\n"))
 	lines := bytes.Split(input, []byte("\n"))