mirror of
https://github.com/containers/podman.git
synced 2025-12-09 15:19:35 +08:00
Merge pull request #2319 from mheon/unconditional_cleanup
Fix manual detach from containers to not wait for exit
This commit is contained in:
@@ -74,7 +74,7 @@ func attachCmd(c *cliconfig.AttachValues) error {
|
||||
inputStream = nil
|
||||
}
|
||||
|
||||
if err := startAttachCtr(ctr, os.Stdout, os.Stderr, inputStream, c.DetachKeys, c.SigProxy, false); err != nil {
|
||||
if err := startAttachCtr(ctr, os.Stdout, os.Stderr, inputStream, c.DetachKeys, c.SigProxy, false); err != nil && errors.Cause(err) != libpod.ErrDetach {
|
||||
return errors.Wrapf(err, "error attaching to container %s", ctr.ID())
|
||||
}
|
||||
|
||||
|
||||
@@ -37,6 +37,7 @@ func init() {
|
||||
|
||||
flags.BoolVarP(&cleanupCommand.All, "all", "a", false, "Cleans up all containers")
|
||||
flags.BoolVarP(&cleanupCommand.Latest, "latest", "l", false, "Act on the latest container podman is aware of")
|
||||
flags.BoolVar(&cleanupCommand.Remove, "rm", false, "After cleanup, remove the container entirely")
|
||||
}
|
||||
|
||||
func cleanupCmd(c *cliconfig.CleanupValues) error {
|
||||
@@ -55,12 +56,25 @@ func cleanupCmd(c *cliconfig.CleanupValues) error {
|
||||
ctx := getContext()
|
||||
|
||||
for _, ctr := range cleanupContainers {
|
||||
if err = ctr.Cleanup(ctx); err != nil {
|
||||
if lastError != nil {
|
||||
fmt.Fprintln(os.Stderr, lastError)
|
||||
hadError := false
|
||||
if c.Remove {
|
||||
if err := runtime.RemoveContainer(ctx, ctr, false); err != nil {
|
||||
if lastError != nil {
|
||||
fmt.Fprintln(os.Stderr, lastError)
|
||||
}
|
||||
lastError = errors.Wrapf(err, "failed to cleanup and remove container %v", ctr.ID())
|
||||
hadError = true
|
||||
}
|
||||
lastError = errors.Wrapf(err, "failed to cleanup container %v", ctr.ID())
|
||||
} else {
|
||||
if err := ctr.Cleanup(ctx); err != nil {
|
||||
if lastError != nil {
|
||||
fmt.Fprintln(os.Stderr, lastError)
|
||||
}
|
||||
lastError = errors.Wrapf(err, "failed to cleanup container %v", ctr.ID())
|
||||
hadError = true
|
||||
}
|
||||
}
|
||||
if !hadError {
|
||||
fmt.Println(ctr.ID())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -531,6 +531,7 @@ type CleanupValues struct {
|
||||
PodmanCommand
|
||||
All bool
|
||||
Latest bool
|
||||
Remove bool
|
||||
}
|
||||
|
||||
type SystemPruneValues struct {
|
||||
|
||||
@@ -118,6 +118,14 @@ func runCmd(c *cliconfig.RunValues) error {
|
||||
}
|
||||
}
|
||||
if err := startAttachCtr(ctr, outputStream, errorStream, inputStream, c.String("detach-keys"), c.Bool("sig-proxy"), true); err != nil {
|
||||
// We've manually detached from the container
|
||||
// Do not perform cleanup, or wait for container exit code
|
||||
// Just exit immediately
|
||||
if errors.Cause(err) == libpod.ErrDetach {
|
||||
exitCode = 0
|
||||
return nil
|
||||
}
|
||||
|
||||
// This means the command did not exist
|
||||
exitCode = 127
|
||||
if strings.Index(err.Error(), "permission denied") > -1 {
|
||||
@@ -147,28 +155,12 @@ func runCmd(c *cliconfig.RunValues) error {
|
||||
exitCode = int(ecode)
|
||||
}
|
||||
|
||||
if createConfig.Rm {
|
||||
return runtime.RemoveContainer(ctx, ctr, true)
|
||||
}
|
||||
|
||||
if err := ctr.Cleanup(ctx); err != nil {
|
||||
// If the container has been removed already, no need to error on cleanup
|
||||
// Also, if it was restarted, don't error either
|
||||
if errors.Cause(err) == libpod.ErrNoSuchCtr ||
|
||||
errors.Cause(err) == libpod.ErrCtrRemoved ||
|
||||
errors.Cause(err) == libpod.ErrCtrStateInvalid {
|
||||
return nil
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Read a container's exit file
|
||||
func readExitFile(runtimeTmp, ctrID string) (int, error) {
|
||||
exitFile := filepath.Join(runtimeTmp, "exits", ctrID)
|
||||
exitFile := filepath.Join(runtimeTmp, "exits", fmt.Sprintf("%s-old", ctrID))
|
||||
|
||||
logrus.Debugf("Attempting to read container %s exit code from file %s", ctrID, exitFile)
|
||||
|
||||
|
||||
@@ -108,6 +108,13 @@ func startCmd(c *cliconfig.StartValues) error {
|
||||
|
||||
// attach to the container and also start it not already running
|
||||
err = startAttachCtr(ctr, os.Stdout, os.Stderr, inputStream, c.DetachKeys, sigProxy, !ctrRunning)
|
||||
if errors.Cause(err) == libpod.ErrDetach {
|
||||
// User manually detached
|
||||
// Exit cleanly immediately
|
||||
exitCode = 0
|
||||
return nil
|
||||
}
|
||||
|
||||
if ctrRunning {
|
||||
return err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user