Kill process instead of container, on container restart.

When Docker restarts a container and something goes wrong attaching
the network, kill the process inside the container instead of killing
the container, so that Docker will restart it again
This commit is contained in:
Bryan Boreham committed 2016-05-06 18:02:11 +01:00
1 parent 01e3d1d81b
commit 8d71467802
2 files changed
+32 -4

No files matched your search

+11 -4
View File
@@ -103,7 +103,7 @@ func (proxy *Proxy) attachWithRetry(id string) {
j := &attachJob{id: id, tryInterval: initialInterval}
j.timer = time.AfterFunc(time.Duration(0), func() {
if err := proxy.attach(id, false); err != nil {
if err := proxy.attach(id, false, false); err != nil {
// The delay at the nth retry is a random value in the range
// [i-i/2,i+i/2], where i = initialInterval * 1.5^(n-1).
j.timer.Reset(j.tryInterval)
@@ -383,7 +383,10 @@ func (proxy *Proxy) listen(protoAndAddr string) (net.Listener, string, error) {
// weavedocker.ContainerObserver interface
func (proxy *Proxy) ContainerStarted(ident string) {
proxy.notifyWaiters(ident, proxy.attach(ident, true))
// In case of attach failure, if we have a request waiting on the start, kill the container,
// otherwise assume it is a Docker-initated restart and kill the process inside.
err := proxy.attach(ident, true, proxy.waitChan(ident) == nil)
proxy.notifyWaiters(ident, err)
}
func containerShouldAttach(container *docker.Container) bool {
@@ -463,7 +466,7 @@ func (proxy *Proxy) ContainerDestroyed(ident string) {}
// Check if this container needs to be attached, if so then attach it,
// and return nil on success or not needed.
func (proxy *Proxy) attach(containerID string, orDie bool) error {
func (proxy *Proxy) attach(containerID string, orDie, killProcess bool) error {
container, err := proxy.client.InspectContainer(containerID)
if err != nil {
if _, ok := err.(*docker.NoSuchContainer); !ok {
@@ -500,7 +503,11 @@ func (proxy *Proxy) attach(containerID string, orDie bool) error {
args = append(args, "--no-multicast-route")
}
if orDie {
args = append(args, "--or-die")
if killProcess {
args = append(args, "--or-kill")
} else {
args = append(args, "--or-die")
}
}
args = append(args, container.ID)
return callWeaveAttach(container, args)