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
} |