@@ -37,9 +37,11 @@ type Sandbox interface {
3737 Rename (name string ) error
3838 // Delete destroys this container after detaching it from all connected endpoints.
3939 Delete () error
40- // ResolveName resolves a service name to an IPv4 or IPv6 address by searching the
41- // networks the sandbox is connected to.
42- ResolveName (name string , iplen int ) []net.IP
40+ // ResolveName resolves a service name to an IPv4 or IPv6 address by searching
41+ // the networks the sandbox is connected to. For IPv6 queries, second return
42+ // value will be true if the name exists in docker domain but doesn't have an
43+ // IPv6 address. Such queries shouldn't be forwarded to external nameservers.
44+ ResolveName (name string , iplen int ) ([]net.IP , bool )
4345 // ResolveIP returns the service name for the passed in IP. IP is in reverse dotted
4446 // notation; the format used for DNS PTR records
4547 ResolveIP (name string ) string
@@ -419,9 +421,7 @@ func (sb *sandbox) execFunc(f func()) {
419421 sb .osSbox .InvokeFunc (f )
420422}
421423
422- func (sb * sandbox ) ResolveName (name string , ipType int ) []net.IP {
423- var ip []net.IP
424-
424+ func (sb * sandbox ) ResolveName (name string , ipType int ) ([]net.IP , bool ) {
425425 // Embedded server owns the docker network domain. Resolution should work
426426 // for both container_name and container_name.network_name
427427 // We allow '.' in service name and network name. For a name a.b.c.d the
@@ -454,21 +454,29 @@ func (sb *sandbox) ResolveName(name string, ipType int) []net.IP {
454454 log .Debugf ("To resolve: %v in %v" , reqName [i ], networkName [i ])
455455
456456 // First check for local container alias
457- ip = sb .resolveName (reqName [i ], networkName [i ], epList , true , ipType )
457+ ip , ipv6Miss : = sb .resolveName (reqName [i ], networkName [i ], epList , true , ipType )
458458 if ip != nil {
459- return ip
459+ return ip , false
460+ }
461+ if ipv6Miss {
462+ return ip , ipv6Miss
460463 }
461464
462465 // Resolve the actual container name
463- ip = sb .resolveName (reqName [i ], networkName [i ], epList , false , ipType )
466+ ip , ipv6Miss = sb .resolveName (reqName [i ], networkName [i ], epList , false , ipType )
464467 if ip != nil {
465- return ip
468+ return ip , false
469+ }
470+ if ipv6Miss {
471+ return ip , ipv6Miss
466472 }
467473 }
468- return nil
474+ return nil , false
469475}
470476
471- func (sb * sandbox ) resolveName (req string , networkName string , epList []* endpoint , alias bool , ipType int ) []net.IP {
477+ func (sb * sandbox ) resolveName (req string , networkName string , epList []* endpoint , alias bool , ipType int ) ([]net.IP , bool ) {
478+ var ipv6Miss bool
479+
472480 for _ , ep := range epList {
473481 name := req
474482 n := ep .getNetwork ()
@@ -507,17 +515,24 @@ func (sb *sandbox) resolveName(req string, networkName string, epList []*endpoin
507515
508516 var ip []net.IP
509517 n .Lock ()
518+ ip , ok = sr .svcMap [name ]
519+
510520 if ipType == netutils .IPv6 {
511- ip , ok = sr .svcIPv6Map [name ]
512- } else {
513- ip , ok = sr .svcMap [name ]
521+ // If the name resolved to v4 address then its a valid name in
522+ // the docker network domain. If the network is not v6 enabled
523+ // set ipv6Miss to filter the DNS query from going to external
524+ // resolvers.
525+ if ok && n .enableIPv6 == false {
526+ ipv6Miss = true
527+ }
528+ ip = sr .svcIPv6Map [name ]
514529 }
515530 n .Unlock ()
516- if ok {
517- return ip
531+ if ip != nil {
532+ return ip , false
518533 }
519534 }
520- return nil
535+ return nil , ipv6Miss
521536}
522537
523538func (sb * sandbox ) SetKey (basePath string ) error {
0 commit comments