mirror of
https://github.com/podman-container-tools/podman.git
synced 2026-09-15 20:17:54 +00:00
This enables programs and scripts wrapping the podman command to handle 'podman rm' and 'podman rmi' failures caused by paused or running containers or due to images having other child images or dependent containers. These errors are common enough that it makes sense to have a more machine readable way of detecting them than parsing the standard error output. Signed-off-by: Ondrej Zoder <ozoder@redhat.com> Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
80 lines
2.5 KiB
Go
80 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/containers/libpod/cmd/podman/cliconfig"
|
|
"github.com/containers/libpod/pkg/adapter"
|
|
"github.com/pkg/errors"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
var (
|
|
rmCommand cliconfig.RmValues
|
|
rmDescription = fmt.Sprintf(`Removes one or more containers from the host. The container name or ID can be used.
|
|
|
|
Command does not remove images. Running containers will not be removed without the -f option.`)
|
|
_rmCommand = &cobra.Command{
|
|
Use: "rm [flags] CONTAINER [CONTAINER...]",
|
|
Short: "Remove one or more containers",
|
|
Long: rmDescription,
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
rmCommand.InputArgs = args
|
|
rmCommand.GlobalFlags = MainGlobalOpts
|
|
rmCommand.Remote = remoteclient
|
|
return rmCmd(&rmCommand)
|
|
},
|
|
Args: func(cmd *cobra.Command, args []string) error {
|
|
return checkAllAndLatest(cmd, args, false)
|
|
},
|
|
Example: `podman rm imageID
|
|
podman rm mywebserver myflaskserver 860a4b23
|
|
podman rm --force --all`,
|
|
}
|
|
)
|
|
|
|
func init() {
|
|
rmCommand.Command = _rmCommand
|
|
rmCommand.SetHelpTemplate(HelpTemplate())
|
|
rmCommand.SetUsageTemplate(UsageTemplate())
|
|
flags := rmCommand.Flags()
|
|
flags.BoolVarP(&rmCommand.All, "all", "a", false, "Remove all containers")
|
|
flags.BoolVarP(&rmCommand.Force, "force", "f", false, "Force removal of a running container. The default is false")
|
|
flags.BoolVarP(&rmCommand.Latest, "latest", "l", false, "Act on the latest container podman is aware of")
|
|
flags.BoolVar(&rmCommand.Storage, "storage", false, "Remove container from storage library")
|
|
flags.BoolVarP(&rmCommand.Volumes, "volumes", "v", false, "Remove the volumes associated with the container")
|
|
markFlagHiddenForRemoteClient("storage", flags)
|
|
markFlagHiddenForRemoteClient("latest", flags)
|
|
}
|
|
|
|
// rmCmd removes one or more containers
|
|
func rmCmd(c *cliconfig.RmValues) error {
|
|
runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
|
|
if err != nil {
|
|
return errors.Wrapf(err, "could not get runtime")
|
|
}
|
|
defer runtime.DeferredShutdown(false)
|
|
|
|
// Storage conflicts with --all/--latest/--volumes
|
|
if c.Storage {
|
|
if c.All || c.Latest || c.Volumes {
|
|
return errors.Errorf("--storage conflicts with --volumes, --all, and --latest")
|
|
}
|
|
}
|
|
|
|
ok, failures, err := runtime.RemoveContainers(getContext(), c)
|
|
if err != nil {
|
|
if len(c.InputArgs) < 2 {
|
|
exitCode = setExitCode(err)
|
|
}
|
|
return err
|
|
}
|
|
|
|
if len(failures) > 0 {
|
|
for _, err := range failures {
|
|
exitCode = setExitCode(err)
|
|
}
|
|
}
|
|
|
|
return printCmdResults(ok, failures)
|
|
}
|