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 <dwalsh@redhat.com> (github: rhatdan)
| ... | ... |
@@ -1,6 +1,7 @@ |
| 1 | 1 |
package daemon |
| 2 | 2 |
|
| 3 | 3 |
import ( |
| 4 |
+ "bytes" |
|
| 4 | 5 |
"encoding/json" |
| 5 | 6 |
"errors" |
| 6 | 7 |
"fmt" |
| ... | ... |
@@ -918,22 +919,33 @@ func (container *Container) setupContainerDns() error {
|
| 918 | 918 |
return err |
| 919 | 919 |
} |
| 920 | 920 |
|
| 921 |
- if config.NetworkMode != "host" && (len(config.Dns) > 0 || len(daemon.config.Dns) > 0 || len(config.DnsSearch) > 0 || len(daemon.config.DnsSearch) > 0) {
|
|
| 922 |
- var ( |
|
| 923 |
- dns = resolvconf.GetNameservers(resolvConf) |
|
| 924 |
- dnsSearch = resolvconf.GetSearchDomains(resolvConf) |
|
| 925 |
- ) |
|
| 926 |
- if len(config.Dns) > 0 {
|
|
| 927 |
- dns = config.Dns |
|
| 928 |
- } else if len(daemon.config.Dns) > 0 {
|
|
| 929 |
- dns = daemon.config.Dns |
|
| 930 |
- } |
|
| 931 |
- if len(config.DnsSearch) > 0 {
|
|
| 932 |
- dnsSearch = config.DnsSearch |
|
| 933 |
- } else if len(daemon.config.DnsSearch) > 0 {
|
|
| 934 |
- dnsSearch = daemon.config.DnsSearch |
|
| 921 |
+ if config.NetworkMode != "host" {
|
|
| 922 |
+ if len(config.Dns) > 0 || len(daemon.config.Dns) > 0 || len(config.DnsSearch) > 0 || len(daemon.config.DnsSearch) > 0 {
|
|
| 923 |
+ var ( |
|
| 924 |
+ dns = resolvconf.GetNameservers(resolvConf) |
|
| 925 |
+ dnsSearch = resolvconf.GetSearchDomains(resolvConf) |
|
| 926 |
+ ) |
|
| 927 |
+ if len(config.Dns) > 0 {
|
|
| 928 |
+ dns = config.Dns |
|
| 929 |
+ } else if len(daemon.config.Dns) > 0 {
|
|
| 930 |
+ dns = daemon.config.Dns |
|
| 931 |
+ } |
|
| 932 |
+ if len(config.DnsSearch) > 0 {
|
|
| 933 |
+ dnsSearch = config.DnsSearch |
|
| 934 |
+ } else if len(daemon.config.DnsSearch) > 0 {
|
|
| 935 |
+ dnsSearch = daemon.config.DnsSearch |
|
| 936 |
+ } |
|
| 937 |
+ return resolvconf.Build(container.ResolvConfPath, dns, dnsSearch) |
|
| 938 |
+ } else {
|
|
| 939 |
+ resolvConf = utils.RemoveLocalDns(resolvConf) |
|
| 940 |
+ if !bytes.Contains(resolvConf, []byte("nameserver")) {
|
|
| 941 |
+ for _, dns := range DefaultDns {
|
|
| 942 |
+ log.Infof("No non localhost DNS resolver found in resolv.conf and containers can't use it. Using default external servers : %v", DefaultDns)
|
|
| 943 |
+ resolvConf = append(append(resolvConf, []byte("\nnameserver ")...), dns...)
|
|
| 944 |
+ } |
|
| 945 |
+ resolvConf = append(resolvConf, []byte("\n")...)
|
|
| 946 |
+ } |
|
| 935 | 947 |
} |
| 936 |
- return resolvconf.Build(container.ResolvConfPath, dns, dnsSearch) |
|
| 937 | 948 |
} |
| 938 | 949 |
return ioutil.WriteFile(container.ResolvConfPath, resolvConf, 0644) |
| 939 | 950 |
} |
| ... | ... |
@@ -1,7 +1,6 @@ |
| 1 | 1 |
package daemon |
| 2 | 2 |
|
| 3 | 3 |
import ( |
| 4 |
- "bytes" |
|
| 5 | 4 |
"fmt" |
| 6 | 5 |
"io" |
| 7 | 6 |
"io/ioutil" |
| ... | ... |
@@ -32,7 +31,6 @@ import ( |
| 32 | 32 |
"github.com/docker/docker/pkg/ioutils" |
| 33 | 33 |
"github.com/docker/docker/pkg/log" |
| 34 | 34 |
"github.com/docker/docker/pkg/namesgenerator" |
| 35 |
- "github.com/docker/docker/pkg/networkfs/resolvconf" |
|
| 36 | 35 |
"github.com/docker/docker/pkg/parsers" |
| 37 | 36 |
"github.com/docker/docker/pkg/parsers/kernel" |
| 38 | 37 |
"github.com/docker/docker/pkg/sysinfo" |
| ... | ... |
@@ -925,9 +923,6 @@ func NewDaemonFromDirectory(config *Config, eng *engine.Engine) (*Daemon, error) |
| 925 | 925 |
eng: eng, |
| 926 | 926 |
trustStore: t, |
| 927 | 927 |
} |
| 928 |
- if err := daemon.checkLocaldns(); err != nil {
|
|
| 929 |
- return nil, err |
|
| 930 |
- } |
|
| 931 | 928 |
if err := daemon.restore(); err != nil {
|
| 932 | 929 |
return nil, err |
| 933 | 930 |
} |
| ... | ... |
@@ -1087,20 +1082,6 @@ func (daemon *Daemon) ContainerGraph() *graphdb.Database {
|
| 1087 | 1087 |
return daemon.containerGraph |
| 1088 | 1088 |
} |
| 1089 | 1089 |
|
| 1090 |
-func (daemon *Daemon) checkLocaldns() error {
|
|
| 1091 |
- resolvConf, err := resolvconf.Get() |
|
| 1092 |
- if err != nil {
|
|
| 1093 |
- return err |
|
| 1094 |
- } |
|
| 1095 |
- resolvConf = utils.RemoveLocalDns(resolvConf) |
|
| 1096 |
- |
|
| 1097 |
- if len(daemon.config.Dns) == 0 && !bytes.Contains(resolvConf, []byte("nameserver")) {
|
|
| 1098 |
- log.Infof("No non localhost DNS resolver found in resolv.conf and containers can't use it. Using default external servers : %v", DefaultDns)
|
|
| 1099 |
- daemon.config.Dns = DefaultDns |
|
| 1100 |
- } |
|
| 1101 |
- return nil |
|
| 1102 |
-} |
|
| 1103 |
- |
|
| 1104 | 1090 |
func (daemon *Daemon) ImageGetCached(imgID string, config *runconfig.Config) (*image.Image, error) {
|
| 1105 | 1091 |
// Retrieve all images |
| 1106 | 1092 |
images, err := daemon.Graph().Map() |