diff options
-rw-r--r-- | cmd/podman/batchcontainer/container.go | 2 | ||||
-rw-r--r-- | cmd/podman/ps.go | 2 | ||||
-rw-r--r-- | libpod/container.go | 12 | ||||
-rw-r--r-- | libpod/container_internal.go | 2 | ||||
-rw-r--r-- | libpod/oci.go | 1 |
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 |