diff --git a/libnetwork/sandbox.go b/libnetwork/sandbox.go index dce169bd04..b8f57fc592 100644 --- a/libnetwork/sandbox.go +++ b/libnetwork/sandbox.go @@ -728,7 +728,7 @@ func (sb *sandbox) restoreOslSandbox() error { } } if ep.needResolver() { - sb.startResolver() + sb.startResolver(true) } } @@ -761,7 +761,7 @@ func (sb *sandbox) populateNetworkResources(ep *endpoint) error { ep.Unlock() if ep.needResolver() { - sb.startResolver() + sb.startResolver(false) } if i != nil && i.srcName != "" { diff --git a/libnetwork/sandbox_dns_unix.go b/libnetwork/sandbox_dns_unix.go index 3f531beb99..735708563f 100644 --- a/libnetwork/sandbox_dns_unix.go +++ b/libnetwork/sandbox_dns_unix.go @@ -21,7 +21,7 @@ const ( filePerm = 0644 ) -func (sb *sandbox) startResolver() { +func (sb *sandbox) startResolver(restore bool) { sb.resolverOnce.Do(func() { var err error sb.resolver = NewResolver(sb) @@ -31,10 +31,16 @@ func (sb *sandbox) startResolver() { } }() - err = sb.rebuildDNS() - if err != nil { - log.Errorf("Updating resolv.conf failed for container %s, %q", sb.ContainerID(), err) - return + // In the case of live restore container is already running with + // right resolv.conf contents created before. Just update the + // external DNS servers from the restored sandbox for embedded + // server to use. + if !restore { + err = sb.rebuildDNS() + if err != nil { + log.Errorf("Updating resolv.conf failed for container %s, %q", sb.ContainerID(), err) + return + } } sb.resolver.SetExtServers(sb.extDNS) diff --git a/libnetwork/sandbox_dns_windows.go b/libnetwork/sandbox_dns_windows.go index f2f58d5b98..e1ca73edef 100644 --- a/libnetwork/sandbox_dns_windows.go +++ b/libnetwork/sandbox_dns_windows.go @@ -8,7 +8,7 @@ import ( // Stub implementations for DNS related functions -func (sb *sandbox) startResolver() { +func (sb *sandbox) startResolver(bool) { } func (sb *sandbox) setupResolutionFiles() error { diff --git a/libnetwork/sandbox_store.go b/libnetwork/sandbox_store.go index 5aa4839406..de76579ff6 100644 --- a/libnetwork/sandbox_store.go +++ b/libnetwork/sandbox_store.go @@ -27,6 +27,7 @@ type sbState struct { dbExists bool Eps []epState EpPriority map[string]int + ExtDNS []string } func (sbs *sbState) Key() []string { @@ -113,6 +114,10 @@ func (sbs *sbState) CopyTo(o datastore.KVObject) error { dstSbs.Eps = append(dstSbs.Eps, eps) } + for _, dns := range sbs.ExtDNS { + dstSbs.ExtDNS = append(dstSbs.ExtDNS, dns) + } + return nil } @@ -126,6 +131,7 @@ func (sb *sandbox) storeUpdate() error { ID: sb.id, Cid: sb.containerID, EpPriority: sb.epPriority, + ExtDNS: sb.extDNS, } retry: @@ -198,6 +204,7 @@ func (c *controller) sandboxCleanup(activeSandboxes map[string]interface{}) { dbIndex: sbs.dbIndex, isStub: true, dbExists: true, + extDNS: sbs.ExtDNS, } msg := " for cleanup"