Skip to content

Commit 030cc8d

Browse files
author
Victor Vieux
committed
Merge pull request moby#1389 from dotcloud/1373-improve_checklocaldns
Consider empty /etc/resolv.conf as local dns + add unit test
2 parents 4dcc0f3 + 3e9575e commit 030cc8d

File tree

4 files changed

+64
-8
lines changed

4 files changed

+64
-8
lines changed

api.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,12 @@ func postContainersCreate(srv *Server, version float64, w http.ResponseWriter, r
488488
return err
489489
}
490490

491-
if len(config.Dns) == 0 && len(srv.runtime.Dns) == 0 && utils.CheckLocalDns() {
491+
resolvConf, err := utils.GetResolvConf()
492+
if err != nil {
493+
return err
494+
}
495+
496+
if len(config.Dns) == 0 && len(srv.runtime.Dns) == 0 && utils.CheckLocalDns(resolvConf) {
492497
out.Warnings = append(out.Warnings, fmt.Sprintf("Docker detected local DNS server on resolv.conf. Using default external servers: %v", defaultDns))
493498
config.Dns = defaultDns
494499
}

builder.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,12 @@ func (builder *Builder) Create(config *Config) (*Container, error) {
8080
return nil, err
8181
}
8282

83-
if len(config.Dns) == 0 && len(builder.runtime.Dns) == 0 && utils.CheckLocalDns() {
83+
resolvConf, err := utils.GetResolvConf()
84+
if err != nil {
85+
return nil, err
86+
}
87+
88+
if len(config.Dns) == 0 && len(builder.runtime.Dns) == 0 && utils.CheckLocalDns(resolvConf) {
8489
//"WARNING: Docker detected local DNS server on resolv.conf. Using default external servers: %v", defaultDns
8590
builder.runtime.Dns = defaultDns
8691
}

utils/utils.go

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -709,17 +709,29 @@ func IsGIT(str string) bool {
709709
return strings.HasPrefix(str, "git://") || strings.HasPrefix(str, "github.com/")
710710
}
711711

712-
func CheckLocalDns() bool {
712+
// GetResolvConf opens and read the content of /etc/resolv.conf.
713+
// It returns it as byte slice.
714+
func GetResolvConf() ([]byte, error) {
713715
resolv, err := ioutil.ReadFile("/etc/resolv.conf")
714716
if err != nil {
715717
Debugf("Error openning resolv.conf: %s", err)
716-
return false
718+
return nil, err
717719
}
718-
for _, ip := range []string{
719-
"127.0.0.1",
720-
"127.0.1.1",
720+
return resolv, nil
721+
}
722+
723+
// CheckLocalDns looks into the /etc/resolv.conf,
724+
// it returns true if there is a local nameserver or if there is no nameserver.
725+
func CheckLocalDns(resolvConf []byte) bool {
726+
if !bytes.Contains(resolvConf, []byte("nameserver")) {
727+
return true
728+
}
729+
730+
for _, ip := range [][]byte{
731+
[]byte("127.0.0.1"),
732+
[]byte("127.0.1.1"),
721733
} {
722-
if strings.Contains(string(resolv), ip) {
734+
if bytes.Contains(resolvConf, ip) {
723735
return true
724736
}
725737
}

utils/utils_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,3 +303,37 @@ func TestParseRepositoryTag(t *testing.T) {
303303
t.Errorf("Expected repo: '%s' and tag: '%s', got '%s' and '%s'", "url:5000/repo", "tag", repo, tag)
304304
}
305305
}
306+
307+
func TestGetResolvConf(t *testing.T) {
308+
resolvConfUtils, err := GetResolvConf()
309+
if err != nil {
310+
t.Fatal(err)
311+
}
312+
resolvConfSystem, err := ioutil.ReadFile("/etc/resolv.conf")
313+
if err != nil {
314+
t.Fatal(err)
315+
}
316+
if string(resolvConfUtils) != string(resolvConfSystem) {
317+
t.Fatalf("/etc/resolv.conf and GetResolvConf have different content.")
318+
}
319+
}
320+
321+
func TestCheclLocalDns(t *testing.T) {
322+
for resolv, result := range map[string]bool{`# Dynamic
323+
nameserver 10.0.2.3
324+
search dotcloud.net`: false,
325+
`# Dynamic
326+
nameserver 127.0.0.1
327+
search dotcloud.net`: true,
328+
`# Dynamic
329+
nameserver 127.0.1.1
330+
search dotcloud.net`: true,
331+
`# Dynamic
332+
`: true,
333+
``: true,
334+
} {
335+
if CheckLocalDns([]byte(resolv)) != result {
336+
t.Fatalf("Wrong local dns detection: {%s} should be %v", resolv, result)
337+
}
338+
}
339+
}

0 commit comments

Comments
 (0)