mirror of
https://github.com/containers/podman.git
synced 2025-06-22 01:48:54 +08:00
podman rm/stop --cidfile
Add a --cidfile flag to podman rm/stop to pass a container ID via a file. Podman run already provides the functionaly to store the ID in a specified file which we now complete with rm/stop. This allows for a better life-cycle management in systemd services. Note that --cdifile can be specified multiple times to rm/stop. Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
This commit is contained in:
@ -26,7 +26,7 @@ var (
|
|||||||
return checkpointCmd(&checkpointCommand)
|
return checkpointCmd(&checkpointCommand)
|
||||||
},
|
},
|
||||||
Args: func(cmd *cobra.Command, args []string) error {
|
Args: func(cmd *cobra.Command, args []string) error {
|
||||||
return checkAllAndLatest(cmd, args, false)
|
return checkAllLatestAndCIDFile(cmd, args, false, false)
|
||||||
},
|
},
|
||||||
Example: `podman container checkpoint --keep ctrID
|
Example: `podman container checkpoint --keep ctrID
|
||||||
podman container checkpoint --all
|
podman container checkpoint --all
|
||||||
|
@ -27,7 +27,7 @@ var (
|
|||||||
return cleanupCmd(&cleanupCommand)
|
return cleanupCmd(&cleanupCommand)
|
||||||
},
|
},
|
||||||
Args: func(cmd *cobra.Command, args []string) error {
|
Args: func(cmd *cobra.Command, args []string) error {
|
||||||
return checkAllAndLatest(cmd, args, false)
|
return checkAllLatestAndCIDFile(cmd, args, false, false)
|
||||||
},
|
},
|
||||||
Example: `podman container cleanup --latest
|
Example: `podman container cleanup --latest
|
||||||
podman container cleanup ctrID1 ctrID2 ctrID3
|
podman container cleanup ctrID1 ctrID2 ctrID3
|
||||||
|
@ -485,6 +485,7 @@ type RmValues struct {
|
|||||||
Latest bool
|
Latest bool
|
||||||
Storage bool
|
Storage bool
|
||||||
Volumes bool
|
Volumes bool
|
||||||
|
CIDFiles []string
|
||||||
}
|
}
|
||||||
|
|
||||||
type RmiValues struct {
|
type RmiValues struct {
|
||||||
@ -560,6 +561,7 @@ type StopValues struct {
|
|||||||
All bool
|
All bool
|
||||||
Latest bool
|
Latest bool
|
||||||
Timeout uint
|
Timeout uint
|
||||||
|
CIDFiles []string
|
||||||
}
|
}
|
||||||
|
|
||||||
type TopValues struct {
|
type TopValues struct {
|
||||||
|
@ -39,24 +39,45 @@ func shortID(id string) string {
|
|||||||
return id
|
return id
|
||||||
}
|
}
|
||||||
|
|
||||||
// checkAllAndLatest checks that --all and --latest are used correctly
|
// checkAllLatestAndCIDFile checks that --all and --latest are used correctly.
|
||||||
func checkAllAndLatest(c *cobra.Command, args []string, ignoreArgLen bool) error {
|
// If cidfile is set, also check for the --cidfile flag.
|
||||||
|
func checkAllLatestAndCIDFile(c *cobra.Command, args []string, ignoreArgLen bool, cidfile bool) error {
|
||||||
argLen := len(args)
|
argLen := len(args)
|
||||||
if c.Flags().Lookup("all") == nil || c.Flags().Lookup("latest") == nil {
|
if c.Flags().Lookup("all") == nil || c.Flags().Lookup("latest") == nil {
|
||||||
|
if !cidfile {
|
||||||
return errors.New("unable to lookup values for 'latest' or 'all'")
|
return errors.New("unable to lookup values for 'latest' or 'all'")
|
||||||
|
} else if c.Flags().Lookup("cidfile") == nil {
|
||||||
|
return errors.New("unable to lookup values for 'latest', 'all' or 'cidfile'")
|
||||||
}
|
}
|
||||||
all, _ := c.Flags().GetBool("all")
|
}
|
||||||
latest, _ := c.Flags().GetBool("latest")
|
|
||||||
if all && latest {
|
specifiedAll, _ := c.Flags().GetBool("all")
|
||||||
|
specifiedLatest, _ := c.Flags().GetBool("latest")
|
||||||
|
specifiedCIDFile := false
|
||||||
|
if cid, _ := c.Flags().GetStringArray("cidfile"); len(cid) > 0 {
|
||||||
|
specifiedCIDFile = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if specifiedCIDFile && (specifiedAll || specifiedLatest) {
|
||||||
|
return errors.Errorf("--all, --latest and --cidfile cannot be used together")
|
||||||
|
} else if specifiedAll && specifiedLatest {
|
||||||
return errors.Errorf("--all and --latest cannot be used together")
|
return errors.Errorf("--all and --latest cannot be used together")
|
||||||
}
|
}
|
||||||
|
|
||||||
if ignoreArgLen {
|
if ignoreArgLen {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if (all || latest) && argLen > 0 {
|
if (argLen > 0) && (specifiedAll || specifiedLatest) {
|
||||||
return errors.Errorf("no arguments are needed with --all or --latest")
|
return errors.Errorf("no arguments are needed with --all or --latest")
|
||||||
|
} else if cidfile && (argLen > 0) && (specifiedAll || specifiedLatest || specifiedCIDFile) {
|
||||||
|
return errors.Errorf("no arguments are needed with --all, --latest or --cidfile")
|
||||||
}
|
}
|
||||||
if argLen < 1 && !all && !latest {
|
|
||||||
|
if specifiedCIDFile {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if argLen < 1 && !specifiedAll && !specifiedLatest && !specifiedCIDFile {
|
||||||
return errors.Errorf("you must provide at least one name or id")
|
return errors.Errorf("you must provide at least one name or id")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
@ -23,7 +23,7 @@ var (
|
|||||||
return initCmd(&initCommand)
|
return initCmd(&initCommand)
|
||||||
},
|
},
|
||||||
Args: func(cmd *cobra.Command, args []string) error {
|
Args: func(cmd *cobra.Command, args []string) error {
|
||||||
return checkAllAndLatest(cmd, args, false)
|
return checkAllLatestAndCIDFile(cmd, args, false, false)
|
||||||
},
|
},
|
||||||
Example: `podman init --latest
|
Example: `podman init --latest
|
||||||
podman init 3c45ef19d893
|
podman init 3c45ef19d893
|
||||||
|
@ -24,7 +24,7 @@ var (
|
|||||||
return killCmd(&killCommand)
|
return killCmd(&killCommand)
|
||||||
},
|
},
|
||||||
Args: func(cmd *cobra.Command, args []string) error {
|
Args: func(cmd *cobra.Command, args []string) error {
|
||||||
return checkAllAndLatest(cmd, args, false)
|
return checkAllLatestAndCIDFile(cmd, args, false, false)
|
||||||
},
|
},
|
||||||
Example: `podman kill mywebserver
|
Example: `podman kill mywebserver
|
||||||
podman kill 860a4b23
|
podman kill 860a4b23
|
||||||
|
@ -35,7 +35,7 @@ var (
|
|||||||
return mountCmd(&mountCommand)
|
return mountCmd(&mountCommand)
|
||||||
},
|
},
|
||||||
Args: func(cmd *cobra.Command, args []string) error {
|
Args: func(cmd *cobra.Command, args []string) error {
|
||||||
return checkAllAndLatest(cmd, args, true)
|
return checkAllLatestAndCIDFile(cmd, args, true, false)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@ -28,7 +28,7 @@ var (
|
|||||||
return podKillCmd(&podKillCommand)
|
return podKillCmd(&podKillCommand)
|
||||||
},
|
},
|
||||||
Args: func(cmd *cobra.Command, args []string) error {
|
Args: func(cmd *cobra.Command, args []string) error {
|
||||||
return checkAllAndLatest(cmd, args, false)
|
return checkAllLatestAndCIDFile(cmd, args, false, false)
|
||||||
},
|
},
|
||||||
Example: `podman pod kill podID
|
Example: `podman pod kill podID
|
||||||
podman pod kill --signal TERM mywebserver
|
podman pod kill --signal TERM mywebserver
|
||||||
|
@ -25,7 +25,7 @@ var (
|
|||||||
return podPauseCmd(&podPauseCommand)
|
return podPauseCmd(&podPauseCommand)
|
||||||
},
|
},
|
||||||
Args: func(cmd *cobra.Command, args []string) error {
|
Args: func(cmd *cobra.Command, args []string) error {
|
||||||
return checkAllAndLatest(cmd, args, false)
|
return checkAllLatestAndCIDFile(cmd, args, false, false)
|
||||||
},
|
},
|
||||||
Example: `podman pod pause podID1 podID2
|
Example: `podman pod pause podID1 podID2
|
||||||
podman pod pause --latest
|
podman pod pause --latest
|
||||||
|
@ -26,7 +26,7 @@ var (
|
|||||||
return podRestartCmd(&podRestartCommand)
|
return podRestartCmd(&podRestartCommand)
|
||||||
},
|
},
|
||||||
Args: func(cmd *cobra.Command, args []string) error {
|
Args: func(cmd *cobra.Command, args []string) error {
|
||||||
return checkAllAndLatest(cmd, args, false)
|
return checkAllLatestAndCIDFile(cmd, args, false, false)
|
||||||
},
|
},
|
||||||
Example: `podman pod restart podID1 podID2
|
Example: `podman pod restart podID1 podID2
|
||||||
podman pod restart --latest
|
podman pod restart --latest
|
||||||
|
@ -26,7 +26,7 @@ var (
|
|||||||
return podRmCmd(&podRmCommand)
|
return podRmCmd(&podRmCommand)
|
||||||
},
|
},
|
||||||
Args: func(cmd *cobra.Command, args []string) error {
|
Args: func(cmd *cobra.Command, args []string) error {
|
||||||
return checkAllAndLatest(cmd, args, false)
|
return checkAllLatestAndCIDFile(cmd, args, false, false)
|
||||||
},
|
},
|
||||||
Example: `podman pod rm mywebserverpod
|
Example: `podman pod rm mywebserverpod
|
||||||
podman pod rm -f 860a4b23
|
podman pod rm -f 860a4b23
|
||||||
|
@ -26,7 +26,7 @@ var (
|
|||||||
return podStartCmd(&podStartCommand)
|
return podStartCmd(&podStartCommand)
|
||||||
},
|
},
|
||||||
Args: func(cmd *cobra.Command, args []string) error {
|
Args: func(cmd *cobra.Command, args []string) error {
|
||||||
return checkAllAndLatest(cmd, args, false)
|
return checkAllLatestAndCIDFile(cmd, args, false, false)
|
||||||
},
|
},
|
||||||
Example: `podman pod start podID
|
Example: `podman pod start podID
|
||||||
podman pod start --latest
|
podman pod start --latest
|
||||||
|
@ -27,7 +27,7 @@ var (
|
|||||||
return podStopCmd(&podStopCommand)
|
return podStopCmd(&podStopCommand)
|
||||||
},
|
},
|
||||||
Args: func(cmd *cobra.Command, args []string) error {
|
Args: func(cmd *cobra.Command, args []string) error {
|
||||||
return checkAllAndLatest(cmd, args, false)
|
return checkAllLatestAndCIDFile(cmd, args, false, false)
|
||||||
},
|
},
|
||||||
Example: `podman pod stop mywebserverpod
|
Example: `podman pod stop mywebserverpod
|
||||||
podman pod stop --latest
|
podman pod stop --latest
|
||||||
|
@ -26,7 +26,7 @@ var (
|
|||||||
return podUnpauseCmd(&podUnpauseCommand)
|
return podUnpauseCmd(&podUnpauseCommand)
|
||||||
},
|
},
|
||||||
Args: func(cmd *cobra.Command, args []string) error {
|
Args: func(cmd *cobra.Command, args []string) error {
|
||||||
return checkAllAndLatest(cmd, args, false)
|
return checkAllLatestAndCIDFile(cmd, args, false, false)
|
||||||
},
|
},
|
||||||
Example: `podman pod unpause podID1 podID2
|
Example: `podman pod unpause podID1 podID2
|
||||||
podman pod unpause --all
|
podman pod unpause --all
|
||||||
|
@ -26,7 +26,7 @@ var (
|
|||||||
return portCmd(&portCommand)
|
return portCmd(&portCommand)
|
||||||
},
|
},
|
||||||
Args: func(cmd *cobra.Command, args []string) error {
|
Args: func(cmd *cobra.Command, args []string) error {
|
||||||
return checkAllAndLatest(cmd, args, true)
|
return checkAllLatestAndCIDFile(cmd, args, true, false)
|
||||||
},
|
},
|
||||||
Example: `podman port --all
|
Example: `podman port --all
|
||||||
podman port ctrID 80/tcp
|
podman port ctrID 80/tcp
|
||||||
|
@ -23,7 +23,7 @@ var (
|
|||||||
return restartCmd(&restartCommand)
|
return restartCmd(&restartCommand)
|
||||||
},
|
},
|
||||||
Args: func(cmd *cobra.Command, args []string) error {
|
Args: func(cmd *cobra.Command, args []string) error {
|
||||||
return checkAllAndLatest(cmd, args, false)
|
return checkAllLatestAndCIDFile(cmd, args, false, false)
|
||||||
},
|
},
|
||||||
Example: `podman restart ctrID
|
Example: `podman restart ctrID
|
||||||
podman restart --latest
|
podman restart --latest
|
||||||
|
@ -26,7 +26,7 @@ var (
|
|||||||
return restoreCmd(&restoreCommand, cmd)
|
return restoreCmd(&restoreCommand, cmd)
|
||||||
},
|
},
|
||||||
Args: func(cmd *cobra.Command, args []string) error {
|
Args: func(cmd *cobra.Command, args []string) error {
|
||||||
return checkAllAndLatest(cmd, args, true)
|
return checkAllLatestAndCIDFile(cmd, args, true, false)
|
||||||
},
|
},
|
||||||
Example: `podman container restore ctrID
|
Example: `podman container restore ctrID
|
||||||
podman container restore --latest
|
podman container restore --latest
|
||||||
|
@ -25,7 +25,7 @@ var (
|
|||||||
return rmCmd(&rmCommand)
|
return rmCmd(&rmCommand)
|
||||||
},
|
},
|
||||||
Args: func(cmd *cobra.Command, args []string) error {
|
Args: func(cmd *cobra.Command, args []string) error {
|
||||||
return checkAllAndLatest(cmd, args, false)
|
return checkAllLatestAndCIDFile(cmd, args, false, true)
|
||||||
},
|
},
|
||||||
Example: `podman rm imageID
|
Example: `podman rm imageID
|
||||||
podman rm mywebserver myflaskserver 860a4b23
|
podman rm mywebserver myflaskserver 860a4b23
|
||||||
@ -44,8 +44,10 @@ func init() {
|
|||||||
flags.BoolVarP(&rmCommand.Latest, "latest", "l", false, "Act on the latest container podman is aware of")
|
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.BoolVar(&rmCommand.Storage, "storage", false, "Remove container from storage library")
|
||||||
flags.BoolVarP(&rmCommand.Volumes, "volumes", "v", false, "Remove anonymous volumes associated with the container")
|
flags.BoolVarP(&rmCommand.Volumes, "volumes", "v", false, "Remove anonymous volumes associated with the container")
|
||||||
|
flags.StringArrayVarP(&rmCommand.CIDFiles, "cidfile", "", nil, "Read the container ID from the file")
|
||||||
markFlagHiddenForRemoteClient("storage", flags)
|
markFlagHiddenForRemoteClient("storage", flags)
|
||||||
markFlagHiddenForRemoteClient("latest", flags)
|
markFlagHiddenForRemoteClient("latest", flags)
|
||||||
|
markFlagHiddenForRemoteClient("cidfile", flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
// rmCmd removes one or more containers
|
// rmCmd removes one or more containers
|
||||||
@ -58,8 +60,8 @@ func rmCmd(c *cliconfig.RmValues) error {
|
|||||||
|
|
||||||
// Storage conflicts with --all/--latest/--volumes
|
// Storage conflicts with --all/--latest/--volumes
|
||||||
if c.Storage {
|
if c.Storage {
|
||||||
if c.All || c.Latest || c.Volumes {
|
if c.All || c.Latest || c.Volumes || c.CIDFiles != nil {
|
||||||
return errors.Errorf("--storage conflicts with --volumes, --all, and --latest")
|
return errors.Errorf("--storage conflicts with --volumes, --all, --latest and --cidfile")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ var (
|
|||||||
return stopCmd(&stopCommand)
|
return stopCmd(&stopCommand)
|
||||||
},
|
},
|
||||||
Args: func(cmd *cobra.Command, args []string) error {
|
Args: func(cmd *cobra.Command, args []string) error {
|
||||||
return checkAllAndLatest(cmd, args, false)
|
return checkAllLatestAndCIDFile(cmd, args, false, true)
|
||||||
},
|
},
|
||||||
Example: `podman stop ctrID
|
Example: `podman stop ctrID
|
||||||
podman stop --latest
|
podman stop --latest
|
||||||
@ -42,7 +42,9 @@ func init() {
|
|||||||
flags.BoolVarP(&stopCommand.Latest, "latest", "l", false, "Act on the latest container podman is aware of")
|
flags.BoolVarP(&stopCommand.Latest, "latest", "l", false, "Act on the latest container podman is aware of")
|
||||||
flags.UintVar(&stopCommand.Timeout, "time", define.CtrRemoveTimeout, "Seconds to wait for stop before killing the container")
|
flags.UintVar(&stopCommand.Timeout, "time", define.CtrRemoveTimeout, "Seconds to wait for stop before killing the container")
|
||||||
flags.UintVarP(&stopCommand.Timeout, "timeout", "t", define.CtrRemoveTimeout, "Seconds to wait for stop before killing the container")
|
flags.UintVarP(&stopCommand.Timeout, "timeout", "t", define.CtrRemoveTimeout, "Seconds to wait for stop before killing the container")
|
||||||
|
flags.StringArrayVarP(&stopCommand.CIDFiles, "cidfile", "", nil, "Read the container ID from the file")
|
||||||
markFlagHiddenForRemoteClient("latest", flags)
|
markFlagHiddenForRemoteClient("latest", flags)
|
||||||
|
markFlagHiddenForRemoteClient("cidfile", flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
// stopCmd stops a container or containers
|
// stopCmd stops a container or containers
|
||||||
|
@ -28,7 +28,7 @@ var (
|
|||||||
return umountCmd(&umountCommand)
|
return umountCmd(&umountCommand)
|
||||||
},
|
},
|
||||||
Args: func(cmd *cobra.Command, args []string) error {
|
Args: func(cmd *cobra.Command, args []string) error {
|
||||||
return checkAllAndLatest(cmd, args, false)
|
return checkAllLatestAndCIDFile(cmd, args, false, false)
|
||||||
},
|
},
|
||||||
Example: `podman umount ctrID
|
Example: `podman umount ctrID
|
||||||
podman umount ctrID1 ctrID2 ctrID3
|
podman umount ctrID1 ctrID2 ctrID3
|
||||||
|
@ -2150,6 +2150,7 @@ _podman_rm() {
|
|||||||
local boolean_options="
|
local boolean_options="
|
||||||
--all
|
--all
|
||||||
-a
|
-a
|
||||||
|
--cidfile
|
||||||
--force
|
--force
|
||||||
-f
|
-f
|
||||||
--help
|
--help
|
||||||
@ -2426,6 +2427,7 @@ _podman_stop() {
|
|||||||
local boolean_options="
|
local boolean_options="
|
||||||
--all
|
--all
|
||||||
-a
|
-a
|
||||||
|
--cidfile
|
||||||
-h
|
-h
|
||||||
--help
|
--help
|
||||||
--latest
|
--latest
|
||||||
|
@ -18,6 +18,10 @@ Running or unusable containers will not be removed without the `-f` option.
|
|||||||
|
|
||||||
Remove all containers. Can be used in conjunction with -f as well.
|
Remove all containers. Can be used in conjunction with -f as well.
|
||||||
|
|
||||||
|
**--cidfile**
|
||||||
|
|
||||||
|
Read container ID from the specified file and remove the container. Can be specified multiple times.
|
||||||
|
|
||||||
**--force**, **-f**
|
**--force**, **-f**
|
||||||
|
|
||||||
Force the removal of running and paused containers. Forcing a container removal also
|
Force the removal of running and paused containers. Forcing a container removal also
|
||||||
@ -50,11 +54,17 @@ Remove a container by its name *mywebserver*
|
|||||||
```
|
```
|
||||||
podman rm mywebserver
|
podman rm mywebserver
|
||||||
```
|
```
|
||||||
|
|
||||||
Remove several containers by name and container id.
|
Remove several containers by name and container id.
|
||||||
```
|
```
|
||||||
podman rm mywebserver myflaskserver 860a4b23
|
podman rm mywebserver myflaskserver 860a4b23
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Remove several containers reading their IDs from files.
|
||||||
|
```
|
||||||
|
podman rm --cidfile ./cidfile-1 --cidfile /home/user/cidfile-2
|
||||||
|
```
|
||||||
|
|
||||||
Forcibly remove a container by container ID.
|
Forcibly remove a container by container ID.
|
||||||
```
|
```
|
||||||
podman rm -f 860a4b23
|
podman rm -f 860a4b23
|
||||||
|
@ -21,6 +21,10 @@ container and also via command line when creating the container.
|
|||||||
|
|
||||||
Stop all running containers. This does not include paused containers.
|
Stop all running containers. This does not include paused containers.
|
||||||
|
|
||||||
|
**--cidfile**
|
||||||
|
|
||||||
|
Read container ID from the specified file and remove the container. Can be specified multiple times.
|
||||||
|
|
||||||
**--latest**, **-l**
|
**--latest**, **-l**
|
||||||
|
|
||||||
Instead of providing the container name or ID, use the last created container. If you use methods other than Podman
|
Instead of providing the container name or ID, use the last created container. If you use methods other than Podman
|
||||||
@ -40,6 +44,10 @@ podman stop 860a4b235279
|
|||||||
|
|
||||||
podman stop mywebserver 860a4b235279
|
podman stop mywebserver 860a4b235279
|
||||||
|
|
||||||
|
podman stop --cidfile /home/user/cidfile-1
|
||||||
|
|
||||||
|
podman stop --cidfile /home/user/cidfile-1 --cidfile ./cidfile-2
|
||||||
|
|
||||||
podman stop --timeout 2 860a4b235279
|
podman stop --timeout 2 860a4b235279
|
||||||
|
|
||||||
podman stop -a
|
podman stop -a
|
||||||
|
@ -79,7 +79,17 @@ func (r *LocalRuntime) StopContainers(ctx context.Context, cli *cliconfig.StopVa
|
|||||||
}
|
}
|
||||||
logrus.Debugf("Setting maximum stop workers to %d", maxWorkers)
|
logrus.Debugf("Setting maximum stop workers to %d", maxWorkers)
|
||||||
|
|
||||||
ctrs, err := shortcuts.GetContainersByContext(cli.All, cli.Latest, cli.InputArgs, r.Runtime)
|
names := cli.InputArgs
|
||||||
|
for _, cidFile := range cli.CIDFiles {
|
||||||
|
content, err := ioutil.ReadFile(cidFile)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, errors.Wrap(err, "error reading CIDFile")
|
||||||
|
}
|
||||||
|
id := strings.Split(string(content), "\n")[0]
|
||||||
|
names = append(names, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
ctrs, err := shortcuts.GetContainersByContext(cli.All, cli.Latest, names, r.Runtime)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
@ -203,7 +213,17 @@ func (r *LocalRuntime) RemoveContainers(ctx context.Context, cli *cliconfig.RmVa
|
|||||||
return ok, failures, nil
|
return ok, failures, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
ctrs, err := shortcuts.GetContainersByContext(cli.All, cli.Latest, cli.InputArgs, r.Runtime)
|
names := cli.InputArgs
|
||||||
|
for _, cidFile := range cli.CIDFiles {
|
||||||
|
content, err := ioutil.ReadFile(cidFile)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, errors.Wrap(err, "error reading CIDFile")
|
||||||
|
}
|
||||||
|
id := strings.Split(string(content), "\n")[0]
|
||||||
|
names = append(names, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
ctrs, err := shortcuts.GetContainersByContext(cli.All, cli.Latest, names, r.Runtime)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Failed to get containers. If force is specified, get the containers ID
|
// Failed to get containers. If force is specified, get the containers ID
|
||||||
// and evict them
|
// and evict them
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package integration
|
package integration
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
. "github.com/containers/libpod/test/utils"
|
. "github.com/containers/libpod/test/utils"
|
||||||
@ -138,11 +139,86 @@ var _ = Describe("Podman rm", func() {
|
|||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("podman rm --cidfile", func() {
|
||||||
|
SkipIfRemote()
|
||||||
|
|
||||||
|
tmpDir, err := ioutil.TempDir("", "")
|
||||||
|
Expect(err).To(BeNil())
|
||||||
|
tmpFile := tmpDir + "cid"
|
||||||
|
|
||||||
|
defer os.RemoveAll(tmpDir)
|
||||||
|
|
||||||
|
session := podmanTest.Podman([]string{"create", "--cidfile", tmpFile, ALPINE, "ls"})
|
||||||
|
session.WaitWithDefaultTimeout()
|
||||||
|
Expect(session.ExitCode()).To(Equal(0))
|
||||||
|
cid := session.OutputToStringArray()[0]
|
||||||
|
Expect(podmanTest.NumberOfContainers()).To(Equal(1))
|
||||||
|
|
||||||
|
result := podmanTest.Podman([]string{"rm", "--cidfile", tmpFile})
|
||||||
|
result.WaitWithDefaultTimeout()
|
||||||
|
Expect(result.ExitCode()).To(Equal(0))
|
||||||
|
output := result.OutputToString()
|
||||||
|
Expect(output).To(ContainSubstring(cid))
|
||||||
|
Expect(podmanTest.NumberOfContainers()).To(Equal(0))
|
||||||
|
})
|
||||||
|
|
||||||
|
It("podman rm multiple --cidfile", func() {
|
||||||
|
SkipIfRemote()
|
||||||
|
|
||||||
|
tmpDir, err := ioutil.TempDir("", "")
|
||||||
|
Expect(err).To(BeNil())
|
||||||
|
tmpFile1 := tmpDir + "cid-1"
|
||||||
|
tmpFile2 := tmpDir + "cid-2"
|
||||||
|
|
||||||
|
defer os.RemoveAll(tmpDir)
|
||||||
|
|
||||||
|
session := podmanTest.Podman([]string{"create", "--cidfile", tmpFile1, ALPINE, "ls"})
|
||||||
|
session.WaitWithDefaultTimeout()
|
||||||
|
Expect(session.ExitCode()).To(Equal(0))
|
||||||
|
cid1 := session.OutputToStringArray()[0]
|
||||||
|
Expect(podmanTest.NumberOfContainers()).To(Equal(1))
|
||||||
|
|
||||||
|
session = podmanTest.Podman([]string{"create", "--cidfile", tmpFile2, ALPINE, "ls"})
|
||||||
|
session.WaitWithDefaultTimeout()
|
||||||
|
Expect(session.ExitCode()).To(Equal(0))
|
||||||
|
cid2 := session.OutputToStringArray()[0]
|
||||||
|
Expect(podmanTest.NumberOfContainers()).To(Equal(2))
|
||||||
|
|
||||||
|
result := podmanTest.Podman([]string{"rm", "--cidfile", tmpFile1, "--cidfile", tmpFile2})
|
||||||
|
result.WaitWithDefaultTimeout()
|
||||||
|
Expect(result.ExitCode()).To(Equal(0))
|
||||||
|
output := result.OutputToString()
|
||||||
|
Expect(output).To(ContainSubstring(cid1))
|
||||||
|
Expect(output).To(ContainSubstring(cid2))
|
||||||
|
Expect(podmanTest.NumberOfContainers()).To(Equal(0))
|
||||||
|
})
|
||||||
|
|
||||||
|
It("podman rm invalid --latest and --cidfile and --all", func() {
|
||||||
|
SkipIfRemote()
|
||||||
|
|
||||||
|
result := podmanTest.Podman([]string{"rm", "--cidfile", "foobar", "--latest"})
|
||||||
|
result.WaitWithDefaultTimeout()
|
||||||
|
Expect(result.ExitCode()).To(Equal(125))
|
||||||
|
|
||||||
|
result = podmanTest.Podman([]string{"rm", "--cidfile", "foobar", "--all"})
|
||||||
|
result.WaitWithDefaultTimeout()
|
||||||
|
Expect(result.ExitCode()).To(Equal(125))
|
||||||
|
|
||||||
|
result = podmanTest.Podman([]string{"rm", "--cidfile", "foobar", "--all", "--latest"})
|
||||||
|
result.WaitWithDefaultTimeout()
|
||||||
|
Expect(result.ExitCode()).To(Equal(125))
|
||||||
|
|
||||||
|
result = podmanTest.Podman([]string{"rm", "--latest", "--all"})
|
||||||
|
result.WaitWithDefaultTimeout()
|
||||||
|
Expect(result.ExitCode()).To(Equal(125))
|
||||||
|
})
|
||||||
|
|
||||||
It("podman rm bogus container", func() {
|
It("podman rm bogus container", func() {
|
||||||
session := podmanTest.Podman([]string{"rm", "bogus"})
|
session := podmanTest.Podman([]string{"rm", "bogus"})
|
||||||
session.WaitWithDefaultTimeout()
|
session.WaitWithDefaultTimeout()
|
||||||
Expect(session.ExitCode()).To(Equal(1))
|
Expect(session.ExitCode()).To(Equal(1))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("podman rm bogus container and a running container", func() {
|
It("podman rm bogus container and a running container", func() {
|
||||||
session := podmanTest.RunTopContainer("test1")
|
session := podmanTest.RunTopContainer("test1")
|
||||||
session.WaitWithDefaultTimeout()
|
session.WaitWithDefaultTimeout()
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package integration
|
package integration
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
@ -215,4 +216,79 @@ var _ = Describe("Podman stop", func() {
|
|||||||
Expect(strings.TrimSpace(finalCtrs.OutputToString())).To(Equal(""))
|
Expect(strings.TrimSpace(finalCtrs.OutputToString())).To(Equal(""))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("podman stop --cidfile", func() {
|
||||||
|
SkipIfRemote()
|
||||||
|
|
||||||
|
tmpDir, err := ioutil.TempDir("", "")
|
||||||
|
Expect(err).To(BeNil())
|
||||||
|
tmpFile := tmpDir + "cid"
|
||||||
|
|
||||||
|
defer os.RemoveAll(tmpDir)
|
||||||
|
|
||||||
|
session := podmanTest.Podman([]string{"create", "--cidfile", tmpFile, "-d", ALPINE, "top"})
|
||||||
|
session.WaitWithDefaultTimeout()
|
||||||
|
Expect(session.ExitCode()).To(Equal(0))
|
||||||
|
cid := session.OutputToStringArray()[0]
|
||||||
|
|
||||||
|
session = podmanTest.Podman([]string{"start", cid})
|
||||||
|
session.WaitWithDefaultTimeout()
|
||||||
|
Expect(session.ExitCode()).To(Equal(0))
|
||||||
|
|
||||||
|
result := podmanTest.Podman([]string{"stop", "--cidfile", tmpFile})
|
||||||
|
result.WaitWithDefaultTimeout()
|
||||||
|
Expect(result.ExitCode()).To(Equal(0))
|
||||||
|
output := result.OutputToString()
|
||||||
|
Expect(output).To(ContainSubstring(cid))
|
||||||
|
})
|
||||||
|
|
||||||
|
It("podman stop multiple --cidfile", func() {
|
||||||
|
SkipIfRemote()
|
||||||
|
|
||||||
|
tmpDir, err := ioutil.TempDir("", "")
|
||||||
|
Expect(err).To(BeNil())
|
||||||
|
tmpFile1 := tmpDir + "cid-1"
|
||||||
|
tmpFile2 := tmpDir + "cid-2"
|
||||||
|
|
||||||
|
defer os.RemoveAll(tmpDir)
|
||||||
|
|
||||||
|
session := podmanTest.Podman([]string{"run", "--cidfile", tmpFile1, "-d", ALPINE, "top"})
|
||||||
|
session.WaitWithDefaultTimeout()
|
||||||
|
Expect(session.ExitCode()).To(Equal(0))
|
||||||
|
cid1 := session.OutputToStringArray()[0]
|
||||||
|
Expect(podmanTest.NumberOfContainers()).To(Equal(1))
|
||||||
|
|
||||||
|
session = podmanTest.Podman([]string{"run", "--cidfile", tmpFile2, "-d", ALPINE, "top"})
|
||||||
|
session.WaitWithDefaultTimeout()
|
||||||
|
Expect(session.ExitCode()).To(Equal(0))
|
||||||
|
cid2 := session.OutputToStringArray()[0]
|
||||||
|
Expect(podmanTest.NumberOfContainers()).To(Equal(2))
|
||||||
|
|
||||||
|
result := podmanTest.Podman([]string{"stop", "--cidfile", tmpFile1, "--cidfile", tmpFile2})
|
||||||
|
result.WaitWithDefaultTimeout()
|
||||||
|
Expect(result.ExitCode()).To(Equal(0))
|
||||||
|
output := result.OutputToString()
|
||||||
|
Expect(output).To(ContainSubstring(cid1))
|
||||||
|
Expect(output).To(ContainSubstring(cid2))
|
||||||
|
Expect(podmanTest.NumberOfContainers()).To(Equal(2))
|
||||||
|
})
|
||||||
|
|
||||||
|
It("podman stop invalid --latest and --cidfile and --all", func() {
|
||||||
|
SkipIfRemote()
|
||||||
|
|
||||||
|
result := podmanTest.Podman([]string{"stop", "--cidfile", "foobar", "--latest"})
|
||||||
|
result.WaitWithDefaultTimeout()
|
||||||
|
Expect(result.ExitCode()).To(Equal(125))
|
||||||
|
|
||||||
|
result = podmanTest.Podman([]string{"stop", "--cidfile", "foobar", "--all"})
|
||||||
|
result.WaitWithDefaultTimeout()
|
||||||
|
Expect(result.ExitCode()).To(Equal(125))
|
||||||
|
|
||||||
|
result = podmanTest.Podman([]string{"stop", "--cidfile", "foobar", "--all", "--latest"})
|
||||||
|
result.WaitWithDefaultTimeout()
|
||||||
|
Expect(result.ExitCode()).To(Equal(125))
|
||||||
|
|
||||||
|
result = podmanTest.Podman([]string{"stop", "--latest", "--all"})
|
||||||
|
result.WaitWithDefaultTimeout()
|
||||||
|
Expect(result.ExitCode()).To(Equal(125))
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
Reference in New Issue
Block a user