daemon/restart.go
bd54a73c
 package daemon
 
0a734182
 import (
a793564b
 	"fmt"
 
3c2886d8
 	"github.com/Sirupsen/logrus"
6bb0d181
 	"github.com/docker/docker/container"
0a734182
 )
c79b9bab
 
abd72d40
 // ContainerRestart stops and starts a container. It attempts to
 // gracefully stop the container within the given timeout, forcefully
 // stopping it if the timeout is exceeded. If given a negative
 // timeout, ContainerRestart will wait forever until a graceful
 // stop. Returns an error if the container cannot be found, or if
 // there is an underlying error at any stage of the restart.
cc703784
 func (daemon *Daemon) ContainerRestart(name string, seconds *int) error {
d7d512bb
 	container, err := daemon.GetContainer(name)
d25a6537
 	if err != nil {
c79b9bab
 		return err
bd54a73c
 	}
cc703784
 	if seconds == nil {
 		stopTimeout := container.StopTimeout()
 		seconds = &stopTimeout
 	}
 	if err := daemon.containerRestart(container, *seconds); err != nil {
a793564b
 		return fmt.Errorf("Cannot restart container %s: %v", name, err)
d25a6537
 	}
c79b9bab
 	return nil
cc703784
 
bd54a73c
 }
4f2a5ba3
 
 // containerRestart attempts to gracefully stop and then start the
 // container. When stopping, wait for the given duration in seconds to
 // gracefully stop, before forcefully terminating the container. If
 // given a negative duration, wait forever for a graceful stop.
6bb0d181
 func (daemon *Daemon) containerRestart(container *container.Container, seconds int) error {
4f2a5ba3
 	// Avoid unnecessarily unmounting and then directly mounting
 	// the container when the container stops and then starts
 	// again
3a497650
 	if err := daemon.Mount(container); err == nil {
 		defer daemon.Unmount(container)
4f2a5ba3
 	}
 
870cf109
 	if container.IsRunning() {
 		// set AutoRemove flag to false before stop so the container won't be
 		// removed during restart process
 		autoRemove := container.HostConfig.AutoRemove
3c2886d8
 
870cf109
 		container.HostConfig.AutoRemove = false
 		err := daemon.containerStop(container, seconds)
 		// restore AutoRemove irrespective of whether the stop worked or not
 		container.HostConfig.AutoRemove = autoRemove
 		// containerStop will write HostConfig to disk, we shall restore AutoRemove
 		// in disk too
 		if toDiskErr := container.ToDiskLocking(); toDiskErr != nil {
 			logrus.Errorf("Write container to disk error: %v", toDiskErr)
 		}
 
 		if err != nil {
 			return err
 		}
4f2a5ba3
 	}
 
bd7d5129
 	if err := daemon.containerStart(container, "", "", true); err != nil {
4f2a5ba3
 		return err
 	}
 
ca5ede2d
 	daemon.LogContainerEvent(container, "restart")
4f2a5ba3
 	return nil
 }