From 082852394691220e509db1da7f531894ff9bca45 Mon Sep 17 00:00:00 2001 From: "Guillaume J. Charmes" Date: Thu, 6 Jun 2013 11:01:09 -0700 Subject: [PATCH] Check for local dns server and output a warning Upstream-commit: a3f6054f974909458c9e820842310987e225b767 Component: engine --- components/engine/api.go | 13 ++++++++++--- components/engine/builder.go | 6 ++++++ components/engine/utils/utils.go | 17 +++++++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/components/engine/api.go b/components/engine/api.go index 5a9bdbbe23..273a0edc3f 100644 --- a/components/engine/api.go +++ b/components/engine/api.go @@ -413,17 +413,23 @@ func postImagesPush(srv *Server, version float64, w http.ResponseWriter, r *http func postContainersCreate(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error { config := &Config{} + out := &APIRun{} + if err := json.NewDecoder(r.Body).Decode(config); err != nil { return err } + + if len(config.Dns) == 0 && len(srv.runtime.Dns) == 0 && utils.CheckLocalDns() { + out.Warnings = append(out.Warnings, fmt.Sprintf("WARNING: Docker detected local DNS server on resolv.conf. Using default external servers: %v", defaultDns)) + config.Dns = defaultDns + } + id, err := srv.ContainerCreate(config) if err != nil { return err } + out.ID = id - out := &APIRun{ - ID: id, - } if config.Memory > 0 && !srv.runtime.capabilities.MemoryLimit { log.Println("WARNING: Your kernel does not support memory limit capabilities. Limitation discarded.") out.Warnings = append(out.Warnings, "Your kernel does not support memory limit capabilities. Limitation discarded.") @@ -432,6 +438,7 @@ func postContainersCreate(srv *Server, version float64, w http.ResponseWriter, r log.Println("WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.") out.Warnings = append(out.Warnings, "Your kernel does not support memory swap capabilities. Limitation discarded.") } + b, err := json.Marshal(out) if err != nil { return err diff --git a/components/engine/builder.go b/components/engine/builder.go index c43f8249fa..02c51fb557 100644 --- a/components/engine/builder.go +++ b/components/engine/builder.go @@ -2,6 +2,7 @@ package docker import ( "fmt" + "github.com/dotcloud/docker/utils" "os" "path" "time" @@ -68,6 +69,11 @@ func (builder *Builder) Create(config *Config) (*Container, error) { return nil, err } + if len(config.Dns) == 0 && len(builder.runtime.Dns) == 0 && utils.CheckLocalDns() { + //"WARNING: Docker detected local DNS server on resolv.conf. Using default external servers: %v", defaultDns + builder.runtime.Dns = defaultDns + } + // If custom dns exists, then create a resolv.conf for the container if len(config.Dns) > 0 || len(builder.runtime.Dns) > 0 { var dns []string diff --git a/components/engine/utils/utils.go b/components/engine/utils/utils.go index d91370c44a..1c4c62eaa3 100644 --- a/components/engine/utils/utils.go +++ b/components/engine/utils/utils.go @@ -620,3 +620,20 @@ func (sf *StreamFormatter) FormatProgress(action, str string) []byte { func (sf *StreamFormatter) Used() bool { return sf.used } + +func CheckLocalDns() bool { + resolv, err := ioutil.ReadFile("/etc/resolv.conf") + if err != nil { + Debugf("Error openning resolv.conf: %s", err) + return false + } + for _, ip := range []string{ + "127.0.0.1", + "127.0.1.1", + } { + if strings.Contains(string(resolv), ip) { + return true + } + } + return false +}