mirror of https://github.com/containers/podman.git
Add podman system prune and info commands
We are missing the equivalence of the docker system commands This patch set adds `podman system prune` and `podman system info` Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
This commit is contained in:
parent
650e242aa9
commit
74d984e056
|
@ -53,6 +53,10 @@ func getImageSubCommands() []cli.Command {
|
|||
}
|
||||
}
|
||||
|
||||
func getSystemSubCommands() []cli.Command {
|
||||
return []cli.Command{infoCommand}
|
||||
}
|
||||
|
||||
func getContainerSubCommands() []cli.Command {
|
||||
return []cli.Command{
|
||||
attachCommand,
|
||||
|
|
|
@ -16,6 +16,10 @@ func getContainerSubCommands() []cli.Command {
|
|||
return []cli.Command{}
|
||||
}
|
||||
|
||||
func getSystemSubCommands() []cli.Command {
|
||||
return []cli.Command{}
|
||||
}
|
||||
|
||||
func getMainAppFlags() []cli.Flag {
|
||||
return []cli.Flag{}
|
||||
}
|
||||
|
|
|
@ -1,9 +1,11 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"github.com/containers/libpod/cmd/podman/libpodruntime"
|
||||
"context"
|
||||
|
||||
"github.com/containers/libpod/cmd/podman/shared"
|
||||
"github.com/containers/libpod/libpod"
|
||||
"github.com/containers/libpod/libpod/adapter"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/urfave/cli"
|
||||
|
@ -25,20 +27,11 @@ var (
|
|||
}
|
||||
)
|
||||
|
||||
func pruneContainersCmd(c *cli.Context) error {
|
||||
var (
|
||||
deleteFuncs []shared.ParallelWorkerInput
|
||||
)
|
||||
|
||||
ctx := getContext()
|
||||
runtime, err := libpodruntime.GetRuntime(c)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "could not get runtime")
|
||||
}
|
||||
defer runtime.Shutdown(false)
|
||||
func pruneContainers(runtime *adapter.LocalRuntime, ctx context.Context, maxWorkers int, force bool) error {
|
||||
var deleteFuncs []shared.ParallelWorkerInput
|
||||
|
||||
filter := func(c *libpod.Container) bool {
|
||||
state, _ := c.State()
|
||||
state, err := c.State()
|
||||
if state == libpod.ContainerStateStopped || (state == libpod.ContainerStateExited && err == nil && c.PodID() == "") {
|
||||
return true
|
||||
}
|
||||
|
@ -54,7 +47,7 @@ func pruneContainersCmd(c *cli.Context) error {
|
|||
for _, container := range delContainers {
|
||||
con := container
|
||||
f := func() error {
|
||||
return runtime.RemoveContainer(ctx, con, c.Bool("force"))
|
||||
return runtime.RemoveContainer(ctx, con, force)
|
||||
}
|
||||
|
||||
deleteFuncs = append(deleteFuncs, shared.ParallelWorkerInput{
|
||||
|
@ -62,13 +55,23 @@ func pruneContainersCmd(c *cli.Context) error {
|
|||
ParallelFunc: f,
|
||||
})
|
||||
}
|
||||
// Run the parallel funcs
|
||||
deleteErrors, errCount := shared.ParallelExecuteWorkerPool(maxWorkers, deleteFuncs)
|
||||
return printParallelOutput(deleteErrors, errCount)
|
||||
}
|
||||
|
||||
func pruneContainersCmd(c *cli.Context) error {
|
||||
runtime, err := adapter.GetRuntime(c)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "could not get runtime")
|
||||
}
|
||||
defer runtime.Shutdown(false)
|
||||
|
||||
maxWorkers := shared.Parallelize("rm")
|
||||
if c.GlobalIsSet("max-workers") {
|
||||
maxWorkers = c.GlobalInt("max-workers")
|
||||
}
|
||||
logrus.Debugf("Setting maximum workers to %d", maxWorkers)
|
||||
|
||||
// Run the parallel funcs
|
||||
deleteErrors, errCount := shared.ParallelExecuteWorkerPool(maxWorkers, deleteFuncs)
|
||||
return printParallelOutput(deleteErrors, errCount)
|
||||
return pruneContainers(runtime, getContext(), maxWorkers, c.Bool("force"))
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ package main
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/containers/libpod/libpod/adapter"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/urfave/cli"
|
||||
|
|
|
@ -97,6 +97,7 @@ func main() {
|
|||
inspectCommand,
|
||||
pullCommand,
|
||||
rmiCommand,
|
||||
systemCommand,
|
||||
tagCommand,
|
||||
versionCommand,
|
||||
}
|
||||
|
|
|
@ -131,6 +131,7 @@ func runCmd(c *cli.Context) error {
|
|||
ctrExitCode, err := readExitFile(runtime.GetConfig().TmpDir, ctr.ID())
|
||||
if err != nil {
|
||||
logrus.Errorf("Cannot get exit code: %v", err)
|
||||
exitCode = 127
|
||||
} else {
|
||||
exitCode = ctrExitCode
|
||||
}
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"sort"
|
||||
|
||||
"github.com/urfave/cli"
|
||||
)
|
||||
|
||||
var (
|
||||
systemSubCommands = []cli.Command{
|
||||
pruneSystemCommand,
|
||||
}
|
||||
systemDescription = "Manage podman"
|
||||
systemCommand = cli.Command{
|
||||
Name: "system",
|
||||
Usage: "Manage podman",
|
||||
Description: systemDescription,
|
||||
ArgsUsage: "",
|
||||
Subcommands: getSystemSubCommandsSorted(),
|
||||
UseShortOptionHandling: true,
|
||||
OnUsageError: usageErrorHandler,
|
||||
}
|
||||
)
|
||||
|
||||
func getSystemSubCommandsSorted() []cli.Command {
|
||||
systemSubCommands = append(systemSubCommands, getSystemSubCommands()...)
|
||||
sort.Sort(commandSortedAlpha{systemSubCommands})
|
||||
return systemSubCommands
|
||||
}
|
|
@ -0,0 +1,107 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/containers/libpod/cmd/podman/shared"
|
||||
"github.com/containers/libpod/libpod/adapter"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/urfave/cli"
|
||||
)
|
||||
|
||||
var (
|
||||
pruneSystemDescription = `
|
||||
podman system prune
|
||||
|
||||
Remove unused data
|
||||
`
|
||||
pruneSystemFlags = []cli.Flag{
|
||||
cli.BoolFlag{
|
||||
Name: "all, a",
|
||||
Usage: "remove all unused data",
|
||||
},
|
||||
cli.BoolFlag{
|
||||
Name: "force, f",
|
||||
Usage: "Do not prompt for confirmation",
|
||||
},
|
||||
cli.BoolFlag{
|
||||
Name: "volumes",
|
||||
Usage: "Prune volumes",
|
||||
},
|
||||
}
|
||||
pruneSystemCommand = cli.Command{
|
||||
Name: "prune",
|
||||
Usage: "Remove unused data",
|
||||
Description: pruneSystemDescription,
|
||||
Action: pruneSystemCmd,
|
||||
OnUsageError: usageErrorHandler,
|
||||
Flags: pruneSystemFlags,
|
||||
}
|
||||
)
|
||||
|
||||
func pruneSystemCmd(c *cli.Context) error {
|
||||
|
||||
// Prompt for confirmation if --force is not set
|
||||
if !c.Bool("force") {
|
||||
reader := bufio.NewReader(os.Stdin)
|
||||
volumeString := ""
|
||||
if c.Bool("volumes") {
|
||||
volumeString = `
|
||||
- all volumes not used by at least one container`
|
||||
}
|
||||
fmt.Printf(`
|
||||
WARNING! This will remove:
|
||||
- all stopped containers%s
|
||||
- all dangling images
|
||||
- all build cache
|
||||
Are you sure you want to continue? [y/N] `, volumeString)
|
||||
ans, err := reader.ReadString('\n')
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "error reading input")
|
||||
}
|
||||
if strings.ToLower(ans)[0] != 'y' {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
runtime, err := adapter.GetRuntime(c)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "could not get runtime")
|
||||
}
|
||||
defer runtime.Shutdown(false)
|
||||
|
||||
ctx := getContext()
|
||||
fmt.Println("Deleted Containers")
|
||||
lasterr := pruneContainers(runtime, ctx, shared.Parallelize("rm"), false)
|
||||
if c.Bool("volumes") {
|
||||
fmt.Println("Deleted Volumes")
|
||||
err := volumePrune(runtime, getContext())
|
||||
if err != nil {
|
||||
if lasterr != nil {
|
||||
logrus.Errorf("%q", lasterr)
|
||||
}
|
||||
lasterr = err
|
||||
}
|
||||
}
|
||||
|
||||
// Call prune; if any cids are returned, print them and then
|
||||
// return err in case an error also came up
|
||||
pruneCids, err := runtime.PruneImages(c.Bool("all"))
|
||||
if len(pruneCids) > 0 {
|
||||
fmt.Println("Deleted Images")
|
||||
for _, cid := range pruneCids {
|
||||
fmt.Println(cid)
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
if lasterr != nil {
|
||||
logrus.Errorf("%q", lasterr)
|
||||
}
|
||||
lasterr = err
|
||||
}
|
||||
return lasterr
|
||||
}
|
|
@ -2,12 +2,13 @@ package main
|
|||
|
||||
import (
|
||||
"bufio"
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/containers/libpod/cmd/podman/libpodruntime"
|
||||
"github.com/containers/libpod/libpod"
|
||||
"github.com/containers/libpod/libpod/adapter"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/urfave/cli"
|
||||
|
@ -37,35 +38,9 @@ var volumePruneCommand = cli.Command{
|
|||
UseShortOptionHandling: true,
|
||||
}
|
||||
|
||||
func volumePruneCmd(c *cli.Context) error {
|
||||
func volumePrune(runtime *adapter.LocalRuntime, ctx context.Context) error {
|
||||
var lastError error
|
||||
|
||||
if err := validateFlags(c, volumePruneFlags); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
runtime, err := libpodruntime.GetRuntime(c)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "error creating libpod runtime")
|
||||
}
|
||||
defer runtime.Shutdown(false)
|
||||
|
||||
ctx := getContext()
|
||||
|
||||
// Prompt for confirmation if --force is not set
|
||||
if !c.Bool("force") {
|
||||
reader := bufio.NewReader(os.Stdin)
|
||||
fmt.Println("WARNING! This will remove all volumes not used by at least one container.")
|
||||
fmt.Print("Are you sure you want to continue? [y/N] ")
|
||||
ans, err := reader.ReadString('\n')
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "error reading input")
|
||||
}
|
||||
if strings.ToLower(ans)[0] != 'y' {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
volumes, err := runtime.GetAllVolumes()
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -84,3 +59,32 @@ func volumePruneCmd(c *cli.Context) error {
|
|||
}
|
||||
return lastError
|
||||
}
|
||||
|
||||
func volumePruneCmd(c *cli.Context) error {
|
||||
|
||||
if err := validateFlags(c, volumePruneFlags); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
runtime, err := adapter.GetRuntime(c)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "error creating libpod runtime")
|
||||
}
|
||||
defer runtime.Shutdown(false)
|
||||
|
||||
// Prompt for confirmation if --force is not set
|
||||
if !c.Bool("force") {
|
||||
reader := bufio.NewReader(os.Stdin)
|
||||
fmt.Println("WARNING! This will remove all volumes not used by at least one container.")
|
||||
fmt.Print("Are you sure you want to continue? [y/N] ")
|
||||
ans, err := reader.ReadString('\n')
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "error reading input")
|
||||
}
|
||||
if strings.ToLower(ans)[0] != 'y' {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
return volumePrune(runtime, getContext())
|
||||
}
|
||||
|
|
|
@ -66,6 +66,7 @@
|
|||
| [podman-start(1)](/docs/podman-start.1.md) | Starts one or more containers
|
||||
| [podman-stats(1)](/docs/podman-stats.1.md) | Display a live stream of one or more containers' resource usage statistics|[](https://asciinema.org/a/vfUPbAA5tsNWhsfB9p25T6xdr)|
|
||||
| [podman-stop(1)](/docs/podman-stop.1.md) | Stops one or more running containers |[](https://asciinema.org/a/KNRF9xVXeaeNTNjBQVogvZBcp)|
|
||||
| [podman-system(1)](/docs/podman-system.1.md) | Manage podman ||
|
||||
| [podman-tag(1)](/docs/podman-tag.1.md) | Add an additional name to a local image |[](https://asciinema.org/a/133803)|
|
||||
| [podman-top(1)](/docs/podman-top.1.md) | Display the running processes of a container |[](https://asciinema.org/a/5WCCi1LXwSuRbvaO9cBUYf3fk)|
|
||||
| [podman-umount(1)](/docs/podman-umount.1.md) | Unmount a working container's root filesystem |[](https://asciinema.org/a/MZPTWD5CVs3dMREkBxQBY9C5z)|
|
||||
|
|
|
@ -979,6 +979,51 @@ _podman_container() {
|
|||
esac
|
||||
}
|
||||
|
||||
_podman_system_info() {
|
||||
_podman_info
|
||||
}
|
||||
|
||||
_podman_system_prune() {
|
||||
local options_with_args="
|
||||
"
|
||||
|
||||
local boolean_options="
|
||||
-a
|
||||
--all
|
||||
-f
|
||||
--force
|
||||
-h
|
||||
--help
|
||||
--volumes
|
||||
"
|
||||
case "$cur" in
|
||||
-*)
|
||||
COMPREPLY=($(compgen -W "$boolean_options $options_with_args" -- "$cur"))
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
_podman_system() {
|
||||
local boolean_options="
|
||||
--help
|
||||
-h
|
||||
"
|
||||
subcommands="
|
||||
info
|
||||
prune
|
||||
"
|
||||
__podman_subcommands "$subcommands" && return
|
||||
|
||||
case "$cur" in
|
||||
-*)
|
||||
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
|
||||
;;
|
||||
*)
|
||||
COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
_podman_commit() {
|
||||
local options_with_args="
|
||||
--author
|
||||
|
@ -2482,6 +2527,11 @@ _podman_container_prune() {
|
|||
-h
|
||||
--help
|
||||
"
|
||||
case "$cur" in
|
||||
-*)
|
||||
COMPREPLY=($(compgen -W "$boolean_options $options_with_args" -- "$cur"))
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
_podman_container_exists() {
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
.so man1/podman-info.1
|
|
@ -1,9 +1,9 @@
|
|||
% podman-version(1)
|
||||
% podman-info(1)
|
||||
|
||||
## NAME
|
||||
podman\-system\-info - Display system information
|
||||
podman\-info - Display system information
|
||||
|
||||
|
||||
## SYNOPSIS
|
||||
**podman info** [*options*]
|
||||
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
% podman-system-prune(1) podman
|
||||
|
||||
## NAME
|
||||
podman\-system\-prune - Remove all unused container, image and volume data
|
||||
|
||||
## SYNOPSIS
|
||||
**podman system prune**
|
||||
[**-all**|**--a**]
|
||||
[**-force**|**--f**]
|
||||
[**-help**|**--h**]
|
||||
[**-volumes**|**--v**]
|
||||
|
||||
## DESCRIPTION
|
||||
**podman system prune** removes all unused containers, (both dangling and unreferenced) from local storage and optionally, volumes.
|
||||
|
||||
With the `all` option, you can delete all unused images. Unused images are dangling images as well as any image that does not have any containers based on it.
|
||||
|
||||
By default, volumes are not removed to prevent important data from being deleted if there is currently no container using the volume. Use the --volumes flag when running the command to prune volumes as well.
|
||||
|
||||
## OPTIONS
|
||||
**--all, -a**
|
||||
|
||||
Remove all unused images not just dangling ones.
|
||||
|
||||
**--force, -f**
|
||||
|
||||
Do not prompt for confirmation
|
||||
|
||||
**--volumes**
|
||||
|
||||
Prune volumes not used by at least one container
|
||||
|
||||
## SEE ALSO
|
||||
podman(1), podman-image-prune(1), podman-container-prune(1), podman-volume-prune(1)
|
||||
|
||||
# HISTORY
|
||||
February 2019, Originally compiled by Dan Walsh (dwalsh at redhat dot com)
|
|
@ -0,0 +1,20 @@
|
|||
% podman-system(1)
|
||||
|
||||
## NAME
|
||||
podman\-system - Manage podman
|
||||
|
||||
## SYNOPSIS
|
||||
**podman system** *subcommand*
|
||||
|
||||
## DESCRIPTION
|
||||
The system command allows you to manage the podman systems
|
||||
|
||||
## COMMANDS
|
||||
|
||||
| Command | Man Page | Description |
|
||||
| ------- | --------------------------------------------------- | ---------------------------------------------------------------------------- |
|
||||
| info | [podman-system-info(1)](podman-info.1.md) | Displays Podman related system information. |
|
||||
| prune | [podman-system-prune(1)](podman-system-prune.1.md) | Remove all unused data |
|
||||
|
||||
## SEE ALSO
|
||||
podman
|
|
@ -162,6 +162,7 @@ the exit codes follow the `chroot` standard, see below:
|
|||
| [podman-start(1)](podman-start.1.md) | Starts one or more containers. |
|
||||
| [podman-stats(1)](podman-stats.1.md) | Display a live stream of one or more container's resource usage statistics. |
|
||||
| [podman-stop(1)](podman-stop.1.md) | Stop one or more running containers. |
|
||||
| [podman-system(1)](podman-system.1.md) | Manage podman. |
|
||||
| [podman-tag(1)](podman-tag.1.md) | Add an additional name to a local image. |
|
||||
| [podman-top(1)](podman-top.1.md) | Display the running processes of a container. |
|
||||
| [podman-umount(1)](podman-umount.1.md) | Unmount a working container's root filesystem. |
|
||||
|
|
|
@ -407,3 +407,28 @@ func (r *LocalRuntime) Import(ctx context.Context, source, reference string, cha
|
|||
}
|
||||
return iopodman.ImportImage().Call(r.Conn, strings.TrimRight(tempFile, ":"), reference, history, changes, true)
|
||||
}
|
||||
|
||||
// GetAllVolumes retrieves all the volumes
|
||||
func (r *LocalRuntime) GetAllVolumes() ([]*libpod.Volume, error) {
|
||||
return nil, libpod.ErrNotImplemented
|
||||
}
|
||||
|
||||
// RemoveVolume removes a volumes
|
||||
func (r *LocalRuntime) RemoveVolume(ctx context.Context, v *libpod.Volume, force, prune bool) error {
|
||||
return libpod.ErrNotImplemented
|
||||
}
|
||||
|
||||
// GetContainers retrieves all containers from the state
|
||||
// Filters can be provided which will determine what containers are included in
|
||||
// the output. Multiple filters are handled by ANDing their output, so only
|
||||
// containers matching all filters are returned
|
||||
func (r *LocalRuntime) GetContainers(filters ...libpod.ContainerFilter) ([]*libpod.Container, error) {
|
||||
return nil, libpod.ErrNotImplemented
|
||||
}
|
||||
|
||||
// RemoveContainer removes the given container
|
||||
// If force is specified, the container will be stopped first
|
||||
// Otherwise, RemoveContainer will return an error if the container is running
|
||||
func (r *LocalRuntime) RemoveContainer(ctx context.Context, c *libpod.Container, force bool) error {
|
||||
return libpod.ErrNotImplemented
|
||||
}
|
||||
|
|
|
@ -39,4 +39,10 @@ var _ = Describe("Podman Info", func() {
|
|||
Expect(session.ExitCode()).To(Equal(0))
|
||||
|
||||
})
|
||||
It("podman system info json output", func() {
|
||||
session := podmanTest.Podman([]string{"system", "info", "--format=json"})
|
||||
session.Wait()
|
||||
Expect(session.ExitCode()).To(Equal(0))
|
||||
|
||||
})
|
||||
})
|
||||
|
|
|
@ -88,4 +88,17 @@ var _ = Describe("Podman rm", func() {
|
|||
Expect(len(images.OutputToStringArray())).To(Equal(0))
|
||||
})
|
||||
|
||||
It("podman system image prune unused images", func() {
|
||||
SkipIfRemote()
|
||||
podmanTest.BuildImage(pruneImage, "alpine_bash:latest", "true")
|
||||
prune := podmanTest.Podman([]string{"system", "prune", "-a", "--force"})
|
||||
prune.WaitWithDefaultTimeout()
|
||||
Expect(prune.ExitCode()).To(Equal(0))
|
||||
|
||||
images := podmanTest.Podman([]string{"images", "-a"})
|
||||
images.WaitWithDefaultTimeout()
|
||||
// all images are unused, so they all should be deleted!
|
||||
Expect(len(images.OutputToStringArray())).To(Equal(0))
|
||||
})
|
||||
|
||||
})
|
||||
|
|
|
@ -63,4 +63,34 @@ var _ = Describe("Podman volume prune", func() {
|
|||
|
||||
podmanTest.Cleanup()
|
||||
})
|
||||
|
||||
It("podman system prune --volume", func() {
|
||||
session := podmanTest.Podman([]string{"volume", "create"})
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session.ExitCode()).To(Equal(0))
|
||||
|
||||
session = podmanTest.Podman([]string{"volume", "create"})
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session.ExitCode()).To(Equal(0))
|
||||
|
||||
session = podmanTest.Podman([]string{"create", "-v", "myvol:/myvol", ALPINE, "ls"})
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session.ExitCode()).To(Equal(0))
|
||||
|
||||
session = podmanTest.Podman([]string{"volume", "ls"})
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session.ExitCode()).To(Equal(0))
|
||||
Expect(len(session.OutputToStringArray())).To(Equal(4))
|
||||
|
||||
session = podmanTest.Podman([]string{"system", "prune", "--force", "--volumes"})
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session.ExitCode()).To(Equal(0))
|
||||
|
||||
session = podmanTest.Podman([]string{"volume", "ls"})
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session.ExitCode()).To(Equal(0))
|
||||
Expect(len(session.OutputToStringArray())).To(Equal(2))
|
||||
|
||||
podmanTest.Cleanup()
|
||||
})
|
||||
})
|
||||
|
|
|
@ -76,7 +76,10 @@ There are other equivalents for these tools
|
|||
| `docker volume ls` | [`podman volume ls`](./docs/podman-volume-ls.1.md) |
|
||||
| `docker volume prune` | [`podman volume prune`](./docs/podman-volume-prune.1.md) |
|
||||
| `docker volume rm` | [`podman volume rm`](./docs/podman-volume-rm.1.md) |
|
||||
| `docker wait` | [`podman wait`](./docs/podman-wait.1.md) |
|
||||
| `docker system` | [`podman system`](./docs/podman-system.1.md) |
|
||||
| `docker system prune` | [`podman system prune`](./docs/podman-system-prune.1.md) |
|
||||
| `docker system info` | [`podman system info`](./docs/podman-system-info.1.md) |
|
||||
| `docker wait` | [`podman wait`](./docs/podman-wait.1.md) |
|
||||
|
||||
**** Use mount to take advantage of the entire linux tool chain rather then just cp. Read [`here`](./docs/podman-cp.1.md) for more information.
|
||||
|
||||
|
@ -95,7 +98,6 @@ Those Docker commands currently do not have equivalents in `podman`:
|
|||
| `docker service` ||
|
||||
| `docker stack` ||
|
||||
| `docker swarm` | podman does not support swarm. We support Kubernetes for orchestration using [CRI-O](https://github.com/kubernetes-sigs/cri-o).|
|
||||
| `docker system` ||
|
||||
| `docker volume` | podman currently supports file volumes. Future enhancement planned to support Docker Volumes Plugins
|
||||
|
||||
## Missing commands in Docker
|
||||
|
|
Loading…
Reference in New Issue