summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd/podman/batchcontainer/container.go2
-rw-r--r--cmd/podman/ps.go2
-rw-r--r--libpod/container.go12
-rw-r--r--libpod/container_internal.go2
-rw-r--r--libpod/oci.go1
5 files changed, 13 insertions, 6 deletions
diff --git a/cmd/podman/batchcontainer/container.go b/cmd/podman/batchcontainer/container.go
index 09db4f8a2..76b10b633 100644
--- a/cmd/podman/batchcontainer/container.go
+++ b/cmd/podman/batchcontainer/container.go
@@ -75,7 +75,7 @@ func BatchContainerOp(ctr *libpod.Container, opts PsOptions) (BatchContainerStru
return errors.Wrapf(err, "unable to obtain container state")
}
- exitCode, err = c.ExitCode()
+ exitCode, _, err = c.ExitCode()
if err != nil {
return errors.Wrapf(err, "unable to obtain container exit code")
}
diff --git a/cmd/podman/ps.go b/cmd/podman/ps.go
index 49e43ffac..22055b274 100644
--- a/cmd/podman/ps.go
+++ b/cmd/podman/ps.go
@@ -324,7 +324,7 @@ func generateContainerFilterFuncs(filter, filterValue string, runtime *libpod.Ru
return nil, errors.Wrapf(err, "exited code out of range %q", filterValue)
}
return func(c *libpod.Container) bool {
- ec, err := c.ExitCode()
+ ec, _, err := c.ExitCode()
if ec == int32(exitCode) && err == nil {
return true
}
diff --git a/libpod/container.go b/libpod/container.go
index f882868ed..38f07bd5b 100644
--- a/libpod/container.go
+++ b/libpod/container.go
@@ -135,6 +135,8 @@ type containerState struct {
FinishedTime time.Time `json:"finishedTime,omitempty"`
// ExitCode is the exit code returned when the container stopped
ExitCode int32 `json:"exitCode,omitempty"`
+ // Exited is whether the container has exited
+ Exited bool `json:"exited,omitempty"`
// OOMKilled indicates that the container was killed as it ran out of
// memory
OOMKilled bool `json:"oomKilled,omitempty"`
@@ -667,16 +669,18 @@ func (c *Container) FinishedTime() (time.Time, error) {
}
// ExitCode returns the exit code of the container as
-// an int32
-func (c *Container) ExitCode() (int32, error) {
+// an int32, and whether the container has exited.
+// If the container has not exited, exit code will always be 0.
+// If the container restarts, the exit code is reset to 0.
+func (c *Container) ExitCode() (int32, bool, error) {
if !c.batched {
c.lock.Lock()
defer c.lock.Unlock()
if err := c.syncContainer(); err != nil {
- return 0, errors.Wrapf(err, "error updating container %s state", c.ID())
+ return 0, false, errors.Wrapf(err, "error updating container %s state", c.ID())
}
}
- return c.state.ExitCode, nil
+ return c.state.ExitCode, c.state.Exited, nil
}
// OOMKilled returns whether the container was killed by an OOM condition
diff --git a/libpod/container_internal.go b/libpod/container_internal.go
index 905402c47..010d01315 100644
--- a/libpod/container_internal.go
+++ b/libpod/container_internal.go
@@ -586,6 +586,8 @@ func (c *Container) reinit(ctx context.Context) error {
// Set and save now to make sure that, if the init() below fails
// we still have a valid state
c.state.State = ContainerStateConfigured
+ c.state.ExitCode = 0
+ c.state.Exited = false
if err := c.save(); err != nil {
return err
}
diff --git a/libpod/oci.go b/libpod/oci.go
index c0478b3b6..3eaf159e7 100644
--- a/libpod/oci.go
+++ b/libpod/oci.go
@@ -450,6 +450,7 @@ func (r *OCIRuntime) updateContainerStatus(ctr *Container) error {
ctr.state.OOMKilled = true
}
+ ctr.state.Exited = true
}
return nil