| ... | ... |
@@ -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") |