mirror of
https://github.com/containers/podman.git
synced 2025-06-26 21:07:02 +08:00
Allow containers to --restart on-failure with --rm
Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
This commit is contained in:
@ -714,3 +714,17 @@ func (c *Container) Restore(ctx context.Context, options ContainerCheckpointOpti
|
||||
defer c.newContainerEvent(events.Restore)
|
||||
return c.restore(ctx, options)
|
||||
}
|
||||
|
||||
// Indicate whether or not the container should restart
|
||||
func (c *Container) ShouldRestart(ctx context.Context) bool {
|
||||
logrus.Debugf("Checking if container %s should restart", c.ID())
|
||||
if !c.batched {
|
||||
c.lock.Lock()
|
||||
defer c.lock.Unlock()
|
||||
|
||||
if err := c.syncContainer(); err != nil {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return c.shouldRestart()
|
||||
}
|
||||
|
@ -206,37 +206,39 @@ func (c *Container) handleExitFile(exitFile string, fi os.FileInfo) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Handle container restart policy.
|
||||
// This is called when a container has exited, and was not explicitly stopped by
|
||||
// an API call to stop the container or pod it is in.
|
||||
func (c *Container) handleRestartPolicy(ctx context.Context) (_ bool, retErr error) {
|
||||
// If we did not get a restart policy match, exit immediately.
|
||||
func (c *Container) shouldRestart() bool {
|
||||
// If we did not get a restart policy match, return false
|
||||
// Do the same if we're not a policy that restarts.
|
||||
if !c.state.RestartPolicyMatch ||
|
||||
c.config.RestartPolicy == RestartPolicyNo ||
|
||||
c.config.RestartPolicy == RestartPolicyNone {
|
||||
return false, nil
|
||||
return false
|
||||
}
|
||||
|
||||
// If we're RestartPolicyOnFailure, we need to check retries and exit
|
||||
// code.
|
||||
if c.config.RestartPolicy == RestartPolicyOnFailure {
|
||||
if c.state.ExitCode == 0 {
|
||||
return false, nil
|
||||
return false
|
||||
}
|
||||
|
||||
// If we don't have a max retries set, continue
|
||||
if c.config.RestartRetries > 0 {
|
||||
if c.state.RestartCount < c.config.RestartRetries {
|
||||
logrus.Debugf("Container %s restart policy trigger: on retry %d (of %d)",
|
||||
c.ID(), c.state.RestartCount, c.config.RestartRetries)
|
||||
} else {
|
||||
logrus.Debugf("Container %s restart policy trigger: retries exhausted", c.ID())
|
||||
return false, nil
|
||||
if c.state.RestartCount >= c.config.RestartRetries {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// Handle container restart policy.
|
||||
// This is called when a container has exited, and was not explicitly stopped by
|
||||
// an API call to stop the container or pod it is in.
|
||||
func (c *Container) handleRestartPolicy(ctx context.Context) (_ bool, retErr error) {
|
||||
if !c.shouldRestart() {
|
||||
return false, nil
|
||||
}
|
||||
logrus.Debugf("Restarting container %s due to restart policy %s", c.ID(), c.config.RestartPolicy)
|
||||
|
||||
// Need to check if dependencies are alive.
|
||||
|
Reference in New Issue
Block a user