Fix error code retrieval for podman start --attach

When we start a container with 'podman run' and it exits and is
removed before we get the code, we grab its exit code from the
Conmon exit file. Podman start --attach wants to do the same, but
was missing the logic. Fix that here.

Also, remove some --rm handling leftover in start. Don't need it
anymore, we have the cleanup process now.

Signed-off-by: Matthew Heon <mheon@redhat.com>
This commit is contained in:
Matthew Heon
2019-02-14 09:58:38 -05:00
committed by Matthew Heon
parent b5653a7f36
commit 2e6fff1f5e

View File

@ -1,14 +1,12 @@
package main package main
import ( import (
"encoding/json"
"fmt" "fmt"
"os" "os"
"github.com/containers/libpod/cmd/podman/cliconfig" "github.com/containers/libpod/cmd/podman/cliconfig"
"github.com/containers/libpod/cmd/podman/libpodruntime" "github.com/containers/libpod/cmd/podman/libpodruntime"
"github.com/containers/libpod/libpod" "github.com/containers/libpod/libpod"
cc "github.com/containers/libpod/pkg/spec"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@ -124,12 +122,22 @@ func startCmd(c *cliconfig.StartValues) error {
} }
if ecode, err := ctr.Wait(); err != nil { if ecode, err := ctr.Wait(); err != nil {
logrus.Errorf("unable to get exit code of container %s: %q", ctr.ID(), err) if errors.Cause(err) == libpod.ErrNoSuchCtr {
// The container may have been removed
// Go looking for an exit file
ctrExitCode, err := readExitFile(runtime.GetConfig().TmpDir, ctr.ID())
if err != nil {
logrus.Errorf("Cannot get exit code: %v", err)
exitCode = 127
} else {
exitCode = ctrExitCode
}
}
} else { } else {
exitCode = int(ecode) exitCode = int(ecode)
} }
return ctr.Cleanup(ctx) return nil
} }
if ctrRunning { if ctrRunning {
fmt.Println(ctr.ID()) fmt.Println(ctr.ID())
@ -137,18 +145,6 @@ func startCmd(c *cliconfig.StartValues) error {
} }
// Handle non-attach start // Handle non-attach start
if err := ctr.Start(ctx); err != nil { if err := ctr.Start(ctx); err != nil {
var createArtifact cc.CreateConfig
artifact, artifactErr := ctr.GetArtifact("create-config")
if artifactErr == nil {
if jsonErr := json.Unmarshal(artifact, &createArtifact); jsonErr != nil {
logrus.Errorf("unable to detect if container %s should be deleted", ctr.ID())
}
if createArtifact.Rm {
if rmErr := runtime.RemoveContainer(ctx, ctr, true, false); rmErr != nil {
logrus.Errorf("unable to remove container %s after it failed to start", ctr.ID())
}
}
}
if lastError != nil { if lastError != nil {
fmt.Fprintln(os.Stderr, lastError) fmt.Fprintln(os.Stderr, lastError)
} }