Merge pull request #877 from sanimej/restart

Setup embedded DNS server correctly on container restart
This commit is contained in:
Madhu Venugopal 2016-01-14 21:00:06 -08:00
commit ef508a21ed
3 changed files with 21 additions and 5 deletions

View File

@ -1,5 +1,8 @@
# Changelog # Changelog
## 0.5.6 (2016-01-14)
- Setup embedded DNS server correctly on container restart. Fixes docker/docker#19354
## 0.5.5 (2016-01-14) ## 0.5.5 (2016-01-14)
- Allow network-scoped alias to be resolved for anonymous endpoint - Allow network-scoped alias to be resolved for anonymous endpoint
- Self repair corrupted IP database that could happen in 1.9.0 & 1.9.1 - Self repair corrupted IP database that could happen in 1.9.0 & 1.9.1

View File

@ -15,7 +15,8 @@ import (
type Resolver interface { type Resolver interface {
// Start starts the name server for the container // Start starts the name server for the container
Start() error Start() error
// Stop stops the name server for the container // Stop stops the name server for the container. Stopped resolver
// can be reused after running the SetupFunc again.
Stop() Stop()
// SetupFunc() provides the setup function that should be run // SetupFunc() provides the setup function that should be run
// in the container's network namespace. // in the container's network namespace.
@ -102,6 +103,8 @@ func (r *resolver) Stop() {
if r.server != nil { if r.server != nil {
r.server.Shutdown() r.server.Shutdown()
} }
r.conn = nil
r.err = fmt.Errorf("setup not done yet")
} }
func (r *resolver) SetExtServers(dns []string) { func (r *resolver) SetExtServers(dns []string) {

View File

@ -488,23 +488,22 @@ func (sb *sandbox) resolveName(req string, networkName string, epList []*endpoin
} }
func (sb *sandbox) SetKey(basePath string) error { func (sb *sandbox) SetKey(basePath string) error {
var err error
if basePath == "" { if basePath == "" {
return types.BadRequestErrorf("invalid sandbox key") return types.BadRequestErrorf("invalid sandbox key")
} }
sb.Lock() sb.Lock()
osSbox := sb.osSbox oldosSbox := sb.osSbox
sb.Unlock() sb.Unlock()
if osSbox != nil { if oldosSbox != nil {
// If we already have an OS sandbox, release the network resources from that // If we already have an OS sandbox, release the network resources from that
// and destroy the OS snab. We are moving into a new home further down. Note that none // and destroy the OS snab. We are moving into a new home further down. Note that none
// of the network resources gets destroyed during the move. // of the network resources gets destroyed during the move.
sb.releaseOSSbox() sb.releaseOSSbox()
} }
osSbox, err = osl.GetSandboxForExternalKey(basePath, sb.Key()) osSbox, err := osl.GetSandboxForExternalKey(basePath, sb.Key())
if err != nil { if err != nil {
return err return err
} }
@ -520,6 +519,17 @@ func (sb *sandbox) SetKey(basePath string) error {
} }
}() }()
// If the resolver was setup before stop it and set it up in the
// new osl sandbox.
if oldosSbox != nil && sb.resolver != nil {
sb.resolver.Stop()
sb.osSbox.InvokeFunc(sb.resolver.SetupFunc())
if err := sb.resolver.Start(); err != nil {
log.Errorf("Resolver Setup/Start failed for container %s, %q", sb.ContainerID(), err)
}
}
for _, ep := range sb.getConnectedEndpoints() { for _, ep := range sb.getConnectedEndpoints() {
if err = sb.populateNetworkResources(ep); err != nil { if err = sb.populateNetworkResources(ep); err != nil {
return err return err