diff --git a/api/grpc/server/server.go b/api/grpc/server/server.go index 1b8736ecc..bc696e7b4 100644 --- a/api/grpc/server/server.go +++ b/api/grpc/server/server.go @@ -146,7 +146,11 @@ func createAPIContainer(c runtime.Container, getPids bool) (*types.Container, er procs = append(procs, appendToProcs) } var pids []int - state := c.State() + state, err := c.Status() + if err != nil { + return nil, grpc.Errorf(codes.Internal, "get status for container: "+err.Error()) + } + if getPids && (state == runtime.Running || state == runtime.Paused) { if pids, err = c.Pids(); err != nil { return nil, grpc.Errorf(codes.Internal, "get all pids for container: "+err.Error()) diff --git a/runtime/container_linux.go b/runtime/container_linux.go index f573473bb..2c6bc7fb1 100644 --- a/runtime/container_linux.go +++ b/runtime/container_linux.go @@ -286,7 +286,22 @@ func (c *container) Stats() (*Stat, error) { // Status implements the runtime Container interface. func (c *container) Status() (State, error) { - return "running", nil + args := c.runtimeArgs + args = append(args, "state", c.id) + + out, err := exec.Command(c.runtime, args...).CombinedOutput() + if err != nil { + return "", fmt.Errorf(string(out)) + } + + // We only require the runtime json output to have a top level Status field. + var s struct { + Status State `json:"status"` + } + if err := json.Unmarshal(out, &s); err != nil { + return "", err + } + return s.Status, nil } func (c *container) OOM() (OOM, error) {