summaryrefslogtreecommitdiff
path: root/cmd/podman/rmi.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/podman/rmi.go')
-rw-r--r--cmd/podman/rmi.go116
1 files changed, 59 insertions, 57 deletions
diff --git a/cmd/podman/rmi.go b/cmd/podman/rmi.go
index 39757272e..709ed14e0 100644
--- a/cmd/podman/rmi.go
+++ b/cmd/podman/rmi.go
@@ -4,66 +4,67 @@ import (
"fmt"
"os"
- "github.com/containers/libpod/libpod/adapter"
+ "github.com/containers/libpod/cmd/podman/cliconfig"
+ "github.com/containers/libpod/cmd/podman/varlink"
+ "github.com/containers/libpod/libpod/image"
+ "github.com/containers/libpod/pkg/adapter"
"github.com/containers/storage"
"github.com/pkg/errors"
- "github.com/urfave/cli"
+ "github.com/spf13/cobra"
)
var (
+ rmiCommand cliconfig.RmiValues
rmiDescription = "Removes one or more locally stored images."
- rmiFlags = []cli.Flag{
- cli.BoolFlag{
- Name: "all, a",
- Usage: "Remove all images",
- },
- cli.BoolFlag{
- Name: "force, f",
- Usage: "Force removal of the image",
+ _rmiCommand = &cobra.Command{
+ Use: "rmi",
+ Short: "Removes one or more images from local storage",
+ Long: rmiDescription,
+ RunE: func(cmd *cobra.Command, args []string) error {
+ rmiCommand.InputArgs = args
+ rmiCommand.GlobalFlags = MainGlobalOpts
+ return rmiCmd(&rmiCommand)
},
+ Example: `podman rmi imageID
+ podman rmi --force alpine
+ podman rmi c4dfb1609ee2 93fd78260bd1 c0ed59d05ff7`,
}
- rmiCommand = cli.Command{
- Name: "rmi",
- Usage: "Remove one or more images from local storage",
- Description: rmiDescription,
- Action: rmiCmd,
- ArgsUsage: "IMAGE-NAME-OR-ID [...]",
- Flags: sortFlags(rmiFlags),
- UseShortOptionHandling: true,
- OnUsageError: usageErrorHandler,
+)
+
+func imageNotFound(err error) bool {
+ if errors.Cause(err) == image.ErrNoSuchImage {
+ return true
}
- rmImageCommand = cli.Command{
- Name: "rm",
- Usage: "Removes one or more images from local storage",
- Description: rmiDescription,
- Action: rmiCmd,
- ArgsUsage: "IMAGE-NAME-OR-ID [...]",
- Flags: rmiFlags,
- UseShortOptionHandling: true,
- OnUsageError: usageErrorHandler,
+ switch err.(type) {
+ case *iopodman.ImageNotFound:
+ return true
}
-)
+ return false
+}
+
+func init() {
+ rmiCommand.Command = _rmiCommand
+ rmiCommand.SetUsageTemplate(UsageTemplate())
+ flags := rmiCommand.Flags()
+ flags.BoolVarP(&rmiCommand.All, "all", "a", false, "Remove all images")
+ flags.BoolVarP(&rmiCommand.Force, "force", "f", false, "Force Removal of the image")
+}
-func rmiCmd(c *cli.Context) error {
+func rmiCmd(c *cliconfig.RmiValues) error {
var (
- lastError error
- deleted bool
- deleteErr error
- msg string
+ lastError error
+ failureCnt int
)
ctx := getContext()
- if err := validateFlags(c, rmiFlags); err != nil {
- return err
- }
- removeAll := c.Bool("all")
- runtime, err := adapter.GetRuntime(c)
+ removeAll := c.All
+ runtime, err := adapter.GetRuntime(&c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
defer runtime.Shutdown(false)
- args := c.Args()
+ args := c.InputArgs
if len(args) == 0 && !removeAll {
return errors.Errorf("image name or ID must be specified")
}
@@ -74,19 +75,21 @@ func rmiCmd(c *cli.Context) error {
images := args[:]
removeImage := func(img *adapter.ContainerImage) {
- deleted = true
- msg, deleteErr = runtime.RemoveImage(ctx, img, c.Bool("force"))
- if deleteErr != nil {
- if errors.Cause(deleteErr) == storage.ErrImageUsedByContainer {
+ msg, err := runtime.RemoveImage(ctx, img, c.Force)
+ if err != nil {
+ if errors.Cause(err) == storage.ErrImageUsedByContainer {
fmt.Printf("A container associated with containers/storage, i.e. via Buildah, CRI-O, etc., may be associated with this image: %-12.12s\n", img.ID())
}
+ if !imageNotFound(err) {
+ failureCnt++
+ }
if lastError != nil {
fmt.Fprintln(os.Stderr, lastError)
}
- lastError = deleteErr
- } else {
- fmt.Println(msg)
+ lastError = err
+ return
}
+ fmt.Println(msg)
}
if removeAll {
@@ -131,22 +134,21 @@ func rmiCmd(c *cli.Context) error {
for _, i := range images {
newImage, err := runtime.NewImageFromLocal(i)
if err != nil {
- fmt.Fprintln(os.Stderr, err)
+ if lastError != nil {
+ if !imageNotFound(lastError) {
+ failureCnt++
+ }
+ fmt.Fprintln(os.Stderr, lastError)
+ }
+ lastError = err
continue
}
removeImage(newImage)
}
}
- // If the user calls remove all and there are none, it should not be a
- // non-zero exit
- if !deleted && removeAll {
- return nil
- }
- // the user tries to remove images that do not exist, that should be a
- // non-zero exit
- if !deleted {
- return errors.Errorf("no valid images to delete")
+ if imageNotFound(lastError) && failureCnt == 0 {
+ exitCode = 1
}
return lastError