Browse code

Add -dns to docker daemon

Guillaume J. Charmes authored on 2013/06/06 06:20:19
Showing 5 changed files
... ...
@@ -7,6 +7,8 @@ import (
7 7
 	"time"
8 8
 )
9 9
 
10
+var defaultDns = []string{"8.8.8.8", "8.8.4.4"}
11
+
10 12
 type Builder struct {
11 13
 	runtime      *Runtime
12 14
 	repositories *TagStore
... ...
@@ -67,14 +69,20 @@ func (builder *Builder) Create(config *Config) (*Container, error) {
67 67
 	}
68 68
 
69 69
 	// If custom dns exists, then create a resolv.conf for the container
70
-	if len(config.Dns) > 0 {
70
+	if len(config.Dns) > 0 || len(builder.runtime.Dns) > 0 {
71
+		var dns []string
72
+		if len(config.Dns) > 0 {
73
+			dns = config.Dns
74
+		} else {
75
+			dns = builder.runtime.Dns
76
+		}
71 77
 		container.ResolvConfPath = path.Join(container.root, "resolv.conf")
72 78
 		f, err := os.Create(container.ResolvConfPath)
73 79
 		if err != nil {
74 80
 			return nil, err
75 81
 		}
76 82
 		defer f.Close()
77
-		for _, dns := range config.Dns {
83
+		for _, dns := range dns {
78 84
 			if _, err := f.Write([]byte("nameserver " + dns + "\n")); err != nil {
79 85
 				return nil, err
80 86
 			}
... ...
@@ -33,6 +33,11 @@ func main() {
33 33
 	bridgeName := flag.String("b", "", "Attach containers to a pre-existing network bridge")
34 34
 	pidfile := flag.String("p", "/var/run/docker.pid", "File containing process PID")
35 35
 	flHost := flag.String("H", fmt.Sprintf("%s:%d", host, port), "Host:port to bind/connect to")
36
+
37
+	flags := flag.NewFlagSet("docker", flag.ContinueOnError)
38
+	var flDns docker.ListOpts
39
+	flags.Var(&flDns, "dns", "Set custom dns servers")
40
+
36 41
 	flag.Parse()
37 42
 	if *bridgeName != "" {
38 43
 		docker.NetworkBridgeIface = *bridgeName
... ...
@@ -65,7 +70,7 @@ func main() {
65 65
 			flag.Usage()
66 66
 			return
67 67
 		}
68
-		if err := daemon(*pidfile, host, port, *flAutoRestart); err != nil {
68
+		if err := daemon(*pidfile, host, port, *flAutoRestart, flDns); err != nil {
69 69
 			log.Fatal(err)
70 70
 			os.Exit(-1)
71 71
 		}
... ...
@@ -104,7 +109,7 @@ func removePidFile(pidfile string) {
104 104
 	}
105 105
 }
106 106
 
107
-func daemon(pidfile, addr string, port int, autoRestart bool) error {
107
+func daemon(pidfile, addr string, port int, autoRestart bool, flDns docker.ListOpts) error {
108 108
 	if addr != "127.0.0.1" {
109 109
 		log.Println("/!\\ DON'T BIND ON ANOTHER IP ADDRESS THAN 127.0.0.1 IF YOU DON'T KNOW WHAT YOU'RE DOING /!\\")
110 110
 	}
... ...
@@ -122,7 +127,7 @@ func daemon(pidfile, addr string, port int, autoRestart bool) error {
122 122
 		os.Exit(0)
123 123
 	}()
124 124
 
125
-	server, err := docker.NewServer(autoRestart)
125
+	server, err := docker.NewServer(autoRestart, flDns)
126 126
 	if err != nil {
127 127
 		return err
128 128
 	}
... ...
@@ -32,6 +32,7 @@ type Runtime struct {
32 32
 	autoRestart    bool
33 33
 	volumes        *Graph
34 34
 	srv            *Server
35
+	Dns            []string
35 36
 }
36 37
 
37 38
 var sysInitPath string
... ...
@@ -245,11 +246,12 @@ func (runtime *Runtime) UpdateCapabilities(quiet bool) {
245 245
 }
246 246
 
247 247
 // FIXME: harmonize with NewGraph()
248
-func NewRuntime(autoRestart bool) (*Runtime, error) {
248
+func NewRuntime(autoRestart bool, dns []string) (*Runtime, error) {
249 249
 	runtime, err := NewRuntimeFromDirectory("/var/lib/docker", autoRestart)
250 250
 	if err != nil {
251 251
 		return nil, err
252 252
 	}
253
+	runtime.Dns = dns
253 254
 
254 255
 	if k, err := utils.GetKernelVersion(); err != nil {
255 256
 		log.Printf("WARNING: %s\n", err)
... ...
@@ -869,11 +869,11 @@ func (srv *Server) ImageInspect(name string) (*Image, error) {
869 869
 	return nil, fmt.Errorf("No such image: %s", name)
870 870
 }
871 871
 
872
-func NewServer(autoRestart bool) (*Server, error) {
872
+func NewServer(autoRestart bool, dns ListOpts) (*Server, error) {
873 873
 	if runtime.GOARCH != "amd64" {
874 874
 		log.Fatalf("The docker runtime currently only supports amd64 (not %s). This will change in the future. Aborting.", runtime.GOARCH)
875 875
 	}
876
-	runtime, err := NewRuntime(autoRestart)
876
+	runtime, err := NewRuntime(autoRestart, dns)
877 877
 	if err != nil {
878 878
 		return nil, err
879 879
 	}
... ...
@@ -70,7 +70,7 @@ type progressReader struct {
70 70
 	readProgress int           // How much has been read so far (bytes)
71 71
 	lastUpdate   int           // How many bytes read at least update
72 72
 	template     string        // Template to print. Default "%v/%v (%v)"
73
-	sf *StreamFormatter
73
+	sf           *StreamFormatter
74 74
 }
75 75
 
76 76
 func (r *progressReader) Read(p []byte) (n int, err error) {
... ...
@@ -103,7 +103,7 @@ func (r *progressReader) Close() error {
103 103
 	return io.ReadCloser(r.reader).Close()
104 104
 }
105 105
 func ProgressReader(r io.ReadCloser, size int, output io.Writer, template []byte, sf *StreamFormatter) *progressReader {
106
-      	tpl := string(template)
106
+	tpl := string(template)
107 107
 	if tpl == "" {
108 108
 		tpl = string(sf.FormatProgress("", "%v/%v (%v)"))
109 109
 	}
... ...
@@ -585,7 +585,7 @@ func (sf *StreamFormatter) FormatStatus(format string, a ...interface{}) []byte
585 585
 	sf.used = true
586 586
 	str := fmt.Sprintf(format, a...)
587 587
 	if sf.json {
588
-		b, err := json.Marshal(&JSONMessage{Status:str});
588
+		b, err := json.Marshal(&JSONMessage{Status: str})
589 589
 		if err != nil {
590 590
 			return sf.FormatError(err)
591 591
 		}
... ...
@@ -597,7 +597,7 @@ func (sf *StreamFormatter) FormatStatus(format string, a ...interface{}) []byte
597 597
 func (sf *StreamFormatter) FormatError(err error) []byte {
598 598
 	sf.used = true
599 599
 	if sf.json {
600
-		if b, err := json.Marshal(&JSONMessage{Error:err.Error()}); err == nil {
600
+		if b, err := json.Marshal(&JSONMessage{Error: err.Error()}); err == nil {
601 601
 			return b
602 602
 		}
603 603
 		return []byte("{\"error\":\"format error\"}")
... ...
@@ -608,10 +608,10 @@ func (sf *StreamFormatter) FormatError(err error) []byte {
608 608
 func (sf *StreamFormatter) FormatProgress(action, str string) []byte {
609 609
 	sf.used = true
610 610
 	if sf.json {
611
-		b, err := json.Marshal(&JSONMessage{Status: action, Progress:str})
611
+		b, err := json.Marshal(&JSONMessage{Status: action, Progress: str})
612 612
 		if err != nil {
613
-                        return nil
614
-                }
613
+			return nil
614
+		}
615 615
 		return b
616 616
 	}
617 617
 	return []byte(action + " " + str + "\r")