summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'cmd')
-rw-r--r--cmd/podman/build.go2
-rw-r--r--cmd/podman/cliconfig/config.go1
-rw-r--r--cmd/podman/commands.go5
-rw-r--r--cmd/podman/common.go13
-rw-r--r--cmd/podman/container.go51
-rw-r--r--cmd/podman/containers_prune.go1
-rw-r--r--cmd/podman/cp.go15
-rw-r--r--cmd/podman/errors.go5
-rw-r--r--cmd/podman/errors_remote.go43
-rw-r--r--cmd/podman/exec.go10
-rw-r--r--cmd/podman/image.go41
-rw-r--r--cmd/podman/images.go30
-rw-r--r--cmd/podman/images_prune.go1
-rw-r--r--cmd/podman/info.go1
-rw-r--r--cmd/podman/main.go3
-rw-r--r--cmd/podman/play_kube.go11
-rw-r--r--cmd/podman/pod_create.go4
-rw-r--r--cmd/podman/pod_ps.go5
-rw-r--r--cmd/podman/pod_start.go2
-rw-r--r--cmd/podman/port.go6
-rw-r--r--cmd/podman/ps.go45
-rw-r--r--cmd/podman/refresh.go6
-rw-r--r--cmd/podman/rmi.go16
-rw-r--r--cmd/podman/runlabel.go7
-rw-r--r--cmd/podman/stop.go67
-rw-r--r--cmd/podman/system_prune.go1
-rw-r--r--cmd/podman/system_renumber.go1
-rw-r--r--cmd/podman/varlink.go3
-rw-r--r--cmd/podman/varlink/io.podman.varlink5
-rw-r--r--cmd/podman/version.go1
-rw-r--r--cmd/podman/volume_ls.go5
-rw-r--r--cmd/podman/volume_prune.go1
32 files changed, 260 insertions, 148 deletions
diff --git a/cmd/podman/build.go b/cmd/podman/build.go
index 8ea9e6957..cfeabfb4e 100644
--- a/cmd/podman/build.go
+++ b/cmd/podman/build.go
@@ -53,7 +53,7 @@ func init() {
flags.SetInterspersed(false)
budFlags := buildahcli.GetBudFlags(&budFlagsValues)
- flag := budFlags.Lookup("pull-always")
+ flag := budFlags.Lookup("pull")
flag.Value.Set("true")
flag.DefValue = "true"
layerFlags := buildahcli.GetLayerFlags(&layerValues)
diff --git a/cmd/podman/cliconfig/config.go b/cmd/podman/cliconfig/config.go
index a9032202f..702e20040 100644
--- a/cmd/podman/cliconfig/config.go
+++ b/cmd/podman/cliconfig/config.go
@@ -409,7 +409,6 @@ type RunlabelValues struct {
Opt2 string
Opt3 string
Quiet bool
- Pull bool
SignaturePolicy string
TlsVerify bool
}
diff --git a/cmd/podman/commands.go b/cmd/podman/commands.go
index fd36e77d5..c261e54e2 100644
--- a/cmd/podman/commands.go
+++ b/cmd/podman/commands.go
@@ -18,7 +18,7 @@ func getMainCommands() []*cobra.Command {
_execCommand,
_generateCommand,
_playCommand,
- _psCommand,
+ &_psCommand,
_loginCommand,
_logoutCommand,
_logsCommand,
@@ -32,7 +32,6 @@ func getMainCommands() []*cobra.Command {
_searchCommand,
_startCommand,
_statsCommand,
- _stopCommand,
_topCommand,
_umountCommand,
_unpauseCommand,
@@ -54,6 +53,7 @@ func getImageSubCommands() []*cobra.Command {
// Commands that the local client implements
func getContainerSubCommands() []*cobra.Command {
+
return []*cobra.Command{
_attachCommand,
_checkpointCommand,
@@ -65,7 +65,6 @@ func getContainerSubCommands() []*cobra.Command {
_exportCommand,
_killCommand,
_logsCommand,
- _psCommand,
_mountCommand,
_pauseCommand,
_portCommand,
diff --git a/cmd/podman/common.go b/cmd/podman/common.go
index f9dfa3759..c9e937825 100644
--- a/cmd/podman/common.go
+++ b/cmd/podman/common.go
@@ -59,6 +59,14 @@ func checkAllAndLatest(c *cobra.Command, args []string, ignoreArgLen bool) error
return nil
}
+// noSubArgs checks that there are no further positional parameters
+func noSubArgs(c *cobra.Command, args []string) error {
+ if len(args) > 0 {
+ return errors.Errorf("`%s` takes no arguments", c.CommandPath())
+ }
+ return nil
+}
+
// getAllOrLatestContainers tries to return the correct list of containers
// depending if --all, --latest or <container-id> is used.
// It requires the Context (c) and the Runtime (runtime). As different
@@ -303,8 +311,8 @@ func getCreateFlags(c *cliconfig.PodmanCommand) {
"kernel-memory", "",
"Kernel memory limit (format: `<number>[<unit>]`, where unit = b, k, m or g)",
)
- createFlags.StringSlice(
- "label", []string{},
+ createFlags.StringSliceP(
+ "label", "l", []string{},
"Set metadata on container (default [])",
)
createFlags.StringSlice(
@@ -519,7 +527,6 @@ func scrubServer(server string) string {
func UsageTemplate() string {
return `Usage:{{if .Runnable}}
{{.UseLine}}{{end}}{{if .HasAvailableSubCommands}}
-
{{.CommandPath}} [command]{{end}}{{if gt (len .Aliases) 0}}
Aliases:
diff --git a/cmd/podman/container.go b/cmd/podman/container.go
index d2450fdd3..0bcdf533a 100644
--- a/cmd/podman/container.go
+++ b/cmd/podman/container.go
@@ -1,28 +1,53 @@
package main
import (
+ "strings"
+
"github.com/containers/libpod/cmd/podman/cliconfig"
"github.com/spf13/cobra"
)
-var containerDescription = "Manage containers"
-var containerCommand = cliconfig.PodmanCommand{
- Command: &cobra.Command{
- Use: "container",
- Short: "Manage Containers",
- Long: containerDescription,
- TraverseChildren: true,
- },
-}
+var (
+ containerDescription = "Manage containers"
+ containerCommand = cliconfig.PodmanCommand{
+ Command: &cobra.Command{
+ Use: "container",
+ Short: "Manage Containers",
+ Long: containerDescription,
+ TraverseChildren: true,
+ },
+ }
-// Commands that are universally implemented.
-var containerCommands = []*cobra.Command{
- _containerExistsCommand,
-}
+ listSubCommand cliconfig.PsValues
+ _listSubCommand = &cobra.Command{
+ Use: strings.Replace(_psCommand.Use, "ps", "list", 1),
+ Args: noSubArgs,
+ Short: _psCommand.Short,
+ Long: _psCommand.Long,
+ Aliases: []string{"ls"},
+ RunE: func(cmd *cobra.Command, args []string) error {
+ listSubCommand.InputArgs = args
+ listSubCommand.GlobalFlags = MainGlobalOpts
+ return psCmd(&listSubCommand)
+ },
+ Example: strings.Replace(_psCommand.Example, "podman ps", "podman container list", -1),
+ }
+
+ // Commands that are universally implemented.
+ containerCommands = []*cobra.Command{
+ _containerExistsCommand,
+ _inspectCommand,
+ _listSubCommand,
+ }
+)
func init() {
+ listSubCommand.Command = _listSubCommand
+ psInit(&listSubCommand)
+
containerCommand.AddCommand(containerCommands...)
containerCommand.AddCommand(getContainerSubCommands()...)
containerCommand.SetUsageTemplate(UsageTemplate())
+
rootCmd.AddCommand(containerCommand.Command)
}
diff --git a/cmd/podman/containers_prune.go b/cmd/podman/containers_prune.go
index 6e4960429..0d0e75332 100644
--- a/cmd/podman/containers_prune.go
+++ b/cmd/podman/containers_prune.go
@@ -21,6 +21,7 @@ var (
`
_pruneContainersCommand = &cobra.Command{
Use: "prune",
+ Args: noSubArgs,
Short: "Remove all stopped containers",
Long: pruneContainersDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/cp.go b/cmd/podman/cp.go
index 30b6d75d2..5958370b6 100644
--- a/cmd/podman/cp.go
+++ b/cmd/podman/cp.go
@@ -240,7 +240,6 @@ func copy(src, destPath, dest string, idMappingOpts storage.IDMappingOptions, ch
// return functions for copying items
copyFileWithTar := chrootarchive.CopyFileWithTarAndChown(chownOpts, digest.Canonical.Digester().Hash(), idMappingOpts.UIDMap, idMappingOpts.GIDMap)
copyWithTar := chrootarchive.CopyWithTarAndChown(chownOpts, digest.Canonical.Digester().Hash(), idMappingOpts.UIDMap, idMappingOpts.GIDMap)
- untarPath := chrootarchive.UntarPathAndChown(chownOpts, digest.Canonical.Digester().Hash(), idMappingOpts.UIDMap, idMappingOpts.GIDMap)
if srcfi.IsDir() {
@@ -263,17 +262,11 @@ func copy(src, destPath, dest string, idMappingOpts storage.IDMappingOptions, ch
if destfi != nil && destfi.IsDir() {
destPath = filepath.Join(destPath, filepath.Base(srcPath))
}
- // Copy the file, preserving attributes.
- logrus.Debugf("copying %q to %q", srcPath, destPath)
- if err = copyFileWithTar(srcPath, destPath); err != nil {
- return errors.Wrapf(err, "error copying %q to %q", srcPath, destPath)
- }
- return nil
}
- // We're extracting an archive into the destination directory.
- logrus.Debugf("extracting contents of %q into %q", srcPath, destPath)
- if err = untarPath(srcPath, destPath); err != nil {
- return errors.Wrapf(err, "error extracting %q into %q", srcPath, destPath)
+ // Copy the file, preserving attributes.
+ logrus.Debugf("copying %q to %q", srcPath, destPath)
+ if err = copyFileWithTar(srcPath, destPath); err != nil {
+ return errors.Wrapf(err, "error copying %q to %q", srcPath, destPath)
}
return nil
}
diff --git a/cmd/podman/errors.go b/cmd/podman/errors.go
index 2572b8779..9731037f4 100644
--- a/cmd/podman/errors.go
+++ b/cmd/podman/errors.go
@@ -1,3 +1,5 @@
+// +build !remoteclient
+
package main
import (
@@ -13,7 +15,8 @@ func outputError(err error) {
if MainGlobalOpts.LogLevel == "debug" {
logrus.Errorf(err.Error())
} else {
- if ee, ok := err.(*exec.ExitError); ok {
+ ee, ok := err.(*exec.ExitError)
+ if ok {
if status, ok := ee.Sys().(syscall.WaitStatus); ok {
exitCode = status.ExitStatus()
}
diff --git a/cmd/podman/errors_remote.go b/cmd/podman/errors_remote.go
new file mode 100644
index 000000000..ab255ea56
--- /dev/null
+++ b/cmd/podman/errors_remote.go
@@ -0,0 +1,43 @@
+// +build remoteclient
+
+package main
+
+import (
+ "fmt"
+ "os"
+ "os/exec"
+ "syscall"
+
+ "github.com/containers/libpod/cmd/podman/varlink"
+ "github.com/pkg/errors"
+ "github.com/sirupsen/logrus"
+)
+
+func outputError(err error) {
+ if MainGlobalOpts.LogLevel == "debug" {
+ logrus.Errorf(err.Error())
+ } else {
+ if ee, ok := err.(*exec.ExitError); ok {
+ if status, ok := ee.Sys().(syscall.WaitStatus); ok {
+ exitCode = status.ExitStatus()
+ }
+ }
+ var ne error
+ switch e := err.(type) {
+ // For some reason golang wont let me list them with commas so listing them all.
+ case *iopodman.ImageNotFound:
+ ne = errors.New(e.Reason)
+ case *iopodman.ContainerNotFound:
+ ne = errors.New(e.Reason)
+ case *iopodman.PodNotFound:
+ ne = errors.New(e.Reason)
+ case *iopodman.VolumeNotFound:
+ ne = errors.New(e.Reason)
+ case *iopodman.ErrorOccurred:
+ ne = errors.New(e.Reason)
+ default:
+ ne = err
+ }
+ fmt.Fprintln(os.Stderr, "Error:", ne.Error())
+ }
+}
diff --git a/cmd/podman/exec.go b/cmd/podman/exec.go
index 032262497..4917fb606 100644
--- a/cmd/podman/exec.go
+++ b/cmd/podman/exec.go
@@ -105,5 +105,13 @@ func execCmd(c *cliconfig.ExecValues) error {
envs = append(envs, fmt.Sprintf("%s=%s", k, v))
}
- return ctr.Exec(c.Tty, c.Privileged, envs, cmd, c.User, c.Workdir)
+ streams := new(libpod.AttachStreams)
+ streams.OutputStream = os.Stdout
+ streams.ErrorStream = os.Stderr
+ streams.InputStream = os.Stdin
+ streams.AttachOutput = true
+ streams.AttachError = true
+ streams.AttachInput = true
+
+ return ctr.Exec(c.Tty, c.Privileged, envs, cmd, c.User, c.Workdir, streams)
}
diff --git a/cmd/podman/image.go b/cmd/podman/image.go
index aaa1866c4..57be7fe14 100644
--- a/cmd/podman/image.go
+++ b/cmd/podman/image.go
@@ -1,6 +1,8 @@
package main
import (
+ "strings"
+
"github.com/containers/libpod/cmd/podman/cliconfig"
"github.com/spf13/cobra"
)
@@ -14,13 +16,39 @@ var (
Long: imageDescription,
},
}
- _imagesSubCommand = _imagesCommand
+ imagesSubCommand cliconfig.ImagesValues
+ _imagesSubCommand = &cobra.Command{
+ Use: strings.Replace(_imagesCommand.Use, "images", "list", 1),
+ Short: _imagesCommand.Short,
+ Long: _imagesCommand.Long,
+ Aliases: []string{"ls"},
+ RunE: func(cmd *cobra.Command, args []string) error {
+ imagesSubCommand.InputArgs = args
+ imagesSubCommand.GlobalFlags = MainGlobalOpts
+ return imagesCmd(&imagesSubCommand)
+ },
+ Example: strings.Replace(_imagesCommand.Example, "podman images", "podman image list", -1),
+ }
+
+ rmSubCommand cliconfig.RmiValues
+ _rmSubCommand = &cobra.Command{
+ Use: strings.Replace(_rmiCommand.Use, "rmi", "rm", 1),
+ Short: _rmiCommand.Short,
+ Long: _rmiCommand.Long,
+ RunE: func(cmd *cobra.Command, args []string) error {
+ rmSubCommand.InputArgs = args
+ rmSubCommand.GlobalFlags = MainGlobalOpts
+ return rmiCmd(&rmSubCommand)
+ },
+ Example: strings.Replace(_rmiCommand.Example, "podman rmi", "podman image rm", -1),
+ }
)
//imageSubCommands are implemented both in local and remote clients
var imageSubCommands = []*cobra.Command{
_buildCommand,
_historyCommand,
+ _imagesSubCommand,
_imageExistsCommand,
_importCommand,
_inspectCommand,
@@ -28,17 +56,20 @@ var imageSubCommands = []*cobra.Command{
_pruneImagesCommand,
_pullCommand,
_pushCommand,
- _rmiCommand,
+ _rmSubCommand,
_saveCommand,
_tagCommand,
}
func init() {
+ rmSubCommand.Command = _rmSubCommand
+ rmiInit(&rmSubCommand)
+
+ imagesSubCommand.Command = _imagesSubCommand
+ imagesInit(&imagesSubCommand)
+
imageCommand.SetUsageTemplate(UsageTemplate())
imageCommand.AddCommand(imageSubCommands...)
imageCommand.AddCommand(getImageSubCommands()...)
- _imagesSubCommand.Aliases = []string{"ls", "list"}
- imageCommand.AddCommand(&_imagesSubCommand)
-
}
diff --git a/cmd/podman/images.go b/cmd/podman/images.go
index e6f4d9a60..26e51bef7 100644
--- a/cmd/podman/images.go
+++ b/cmd/podman/images.go
@@ -102,22 +102,26 @@ var (
}
)
-func init() {
- imagesCommand.Command = &_imagesCommand
- imagesCommand.SetUsageTemplate(UsageTemplate())
-
- flags := imagesCommand.Flags()
- flags.BoolVarP(&imagesCommand.All, "all", "a", false, "Show all images (default hides intermediate images)")
- flags.BoolVar(&imagesCommand.Digests, "digests", false, "Show digests")
- flags.StringSliceVarP(&imagesCommand.Filter, "filter", "f", []string{}, "Filter output based on conditions provided (default [])")
- flags.StringVar(&imagesCommand.Format, "format", "", "Change the output format to JSON or a Go template")
- flags.BoolVarP(&imagesCommand.Noheading, "noheading", "n", false, "Do not print column headings")
+func imagesInit(command *cliconfig.ImagesValues) {
+ command.SetUsageTemplate(UsageTemplate())
+
+ flags := command.Flags()
+ flags.BoolVarP(&command.All, "all", "a", false, "Show all images (default hides intermediate images)")
+ flags.BoolVar(&command.Digests, "digests", false, "Show digests")
+ flags.StringSliceVarP(&command.Filter, "filter", "f", []string{}, "Filter output based on conditions provided (default [])")
+ flags.StringVar(&command.Format, "format", "", "Change the output format to JSON or a Go template")
+ flags.BoolVarP(&command.Noheading, "noheading", "n", false, "Do not print column headings")
// TODO Need to learn how to deal with second name being a string instead of a char.
// This needs to be "no-trunc, notruncate"
- flags.BoolVar(&imagesCommand.NoTrunc, "no-trunc", false, "Do not truncate output")
- flags.BoolVarP(&imagesCommand.Quiet, "quiet", "q", false, "Display only image IDs")
- flags.StringVar(&imagesCommand.Sort, "sort", "created", "Sort by created, id, repository, size, or tag")
+ flags.BoolVar(&command.NoTrunc, "no-trunc", false, "Do not truncate output")
+ flags.BoolVarP(&command.Quiet, "quiet", "q", false, "Display only image IDs")
+ flags.StringVar(&command.Sort, "sort", "created", "Sort by created, id, repository, size, or tag")
+
+}
+func init() {
+ imagesCommand.Command = &_imagesCommand
+ imagesInit(&imagesCommand)
}
func imagesCmd(c *cliconfig.ImagesValues) error {
diff --git a/cmd/podman/images_prune.go b/cmd/podman/images_prune.go
index 79dcd097c..427374f68 100644
--- a/cmd/podman/images_prune.go
+++ b/cmd/podman/images_prune.go
@@ -18,6 +18,7 @@ var (
`
_pruneImagesCommand = &cobra.Command{
Use: "prune",
+ Args: noSubArgs,
Short: "Remove unused images",
Long: pruneImagesDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/info.go b/cmd/podman/info.go
index a1473dac9..e87f4e151 100644
--- a/cmd/podman/info.go
+++ b/cmd/podman/info.go
@@ -19,6 +19,7 @@ var (
infoDescription = "Display podman system information"
_infoCommand = &cobra.Command{
Use: "info",
+ Args: noSubArgs,
Long: infoDescription,
Short: `Display information pertaining to the host, current storage stats, and build of podman. Useful for the user and when reporting issues.`,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/main.go b/cmd/podman/main.go
index d36270853..b3faf05c0 100644
--- a/cmd/podman/main.go
+++ b/cmd/podman/main.go
@@ -47,8 +47,9 @@ var mainCommands = []*cobra.Command{
podCommand.Command,
_pullCommand,
_pushCommand,
- _rmiCommand,
+ &_rmiCommand,
_saveCommand,
+ _stopCommand,
_tagCommand,
_versionCommand,
imageCommand.Command,
diff --git a/cmd/podman/play_kube.go b/cmd/podman/play_kube.go
index 6f23e340e..ac46ad5c6 100644
--- a/cmd/podman/play_kube.go
+++ b/cmd/podman/play_kube.go
@@ -90,8 +90,17 @@ func playKubeYAMLCmd(c *cliconfig.KubePlayValues) error {
return errors.Wrapf(err, "unable to read %s as YAML", args[0])
}
+ // check for name collision between pod and container
+ podName := podYAML.ObjectMeta.Name
+ for _, n := range podYAML.Spec.Containers {
+ if n.Name == podName {
+ fmt.Printf("a container exists with the same name (%s) as the pod in your YAML file; changing pod name to %s_pod\n", podName, podName)
+ podName = fmt.Sprintf("%s_pod", podName)
+ }
+ }
+
podOptions = append(podOptions, libpod.WithInfraContainer())
- podOptions = append(podOptions, libpod.WithPodName(podYAML.ObjectMeta.Name))
+ podOptions = append(podOptions, libpod.WithPodName(podName))
// TODO for now we just used the default kernel namespaces; we need to add/subtract this from yaml
nsOptions, err := shared.GetNamespaceOptions(strings.Split(DefaultKernelNamespaces, ","))
diff --git a/cmd/podman/pod_create.go b/cmd/podman/pod_create.go
index f1bbecb84..43c211b2c 100644
--- a/cmd/podman/pod_create.go
+++ b/cmd/podman/pod_create.go
@@ -24,6 +24,7 @@ var (
_podCreateCommand = &cobra.Command{
Use: "create",
+ Args: noSubArgs,
Short: "Create a new empty pod",
Long: podCreateDescription,
RunE: func(cmd *cobra.Command, args []string) error {
@@ -59,9 +60,6 @@ func podCreateCmd(c *cliconfig.PodCreateValues) error {
podIdFile *os.File
)
- if len(c.InputArgs) > 0 {
- return errors.New("podman pod create does not accept any arguments")
- }
runtime, err := adapter.GetRuntime(&c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating libpod runtime")
diff --git a/cmd/podman/pod_ps.go b/cmd/podman/pod_ps.go
index 70e077651..8e48740e6 100644
--- a/cmd/podman/pod_ps.go
+++ b/cmd/podman/pod_ps.go
@@ -121,6 +121,7 @@ var (
_podPsCommand = &cobra.Command{
Use: "ps",
Aliases: []string{"ls", "list"},
+ Args: noSubArgs,
Short: "List pods",
Long: podPsDescription,
RunE: func(cmd *cobra.Command, args []string) error {
@@ -160,10 +161,6 @@ func podPsCmd(c *cliconfig.PodPsValues) error {
}
defer runtime.Shutdown(false)
- if len(c.InputArgs) > 0 {
- return errors.Errorf("too many arguments, ps takes no arguments")
- }
-
opts := podPsOptions{
NoTrunc: c.NoTrunc,
Quiet: c.Quiet,
diff --git a/cmd/podman/pod_start.go b/cmd/podman/pod_start.go
index eef9d2a71..ca8ad08cf 100644
--- a/cmd/podman/pod_start.go
+++ b/cmd/podman/pod_start.go
@@ -18,7 +18,7 @@ var (
Starts one or more pods. The pod name or ID can be used.
`
_podStartCommand = &cobra.Command{
- Use: "start POD [POD...]",
+ Use: "start [flags] POD [POD...]",
Short: "Start one or more pods",
Long: podStartDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/port.go b/cmd/podman/port.go
index 1c3086536..ffb5749fb 100644
--- a/cmd/podman/port.go
+++ b/cmd/podman/port.go
@@ -128,9 +128,6 @@ func portCmd(c *cliconfig.PortValues) error {
if state, _ := con.State(); state != libpod.ContainerStateRunning {
continue
}
- if c.All {
- fmt.Println(con.ID())
- }
portmappings, err := con.PortMappings()
if err != nil {
@@ -143,6 +140,9 @@ func portCmd(c *cliconfig.PortValues) error {
if hostIP == "" {
hostIP = "0.0.0.0"
}
+ if c.All {
+ fmt.Printf("%s\t", con.ID()[:12])
+ }
// If not searching by port or port/proto, then dump what we see
if port == "" {
fmt.Printf("%d/%s -> %s:%d\n", v.ContainerPort, v.Protocol, hostIP, v.HostPort)
diff --git a/cmd/podman/ps.go b/cmd/podman/ps.go
index 3bc4f0b08..0dedd850d 100644
--- a/cmd/podman/ps.go
+++ b/cmd/podman/ps.go
@@ -157,8 +157,9 @@ func (a psSortedSize) Less(i, j int) bool {
var (
psCommand cliconfig.PsValues
psDescription = "Prints out information about the containers"
- _psCommand = &cobra.Command{
+ _psCommand = cobra.Command{
Use: "ps",
+ Args: noSubArgs,
Short: "List containers",
Long: psDescription,
RunE: func(cmd *cobra.Command, args []string) error {
@@ -172,27 +173,31 @@ var (
}
)
-func init() {
- psCommand.Command = _psCommand
- psCommand.SetUsageTemplate(UsageTemplate())
- flags := psCommand.Flags()
- flags.BoolVarP(&psCommand.All, "all", "a", false, "Show all the containers, default is only running containers")
- flags.StringSliceVarP(&psCommand.Filter, "filter", "f", []string{}, "Filter output based on conditions given")
- flags.StringVar(&psCommand.Format, "format", "", "Pretty-print containers to JSON or using a Go template")
- flags.IntVarP(&psCommand.Last, "last", "n", -1, "Print the n last created containers (all states)")
- flags.BoolVarP(&psCommand.Latest, "latest", "l", false, "Show the latest container created (all states)")
- flags.BoolVar(&psCommand.Namespace, "namespace", false, "Display namespace information")
- flags.BoolVar(&psCommand.Namespace, "ns", false, "Display namespace information")
- flags.BoolVar(&psCommand.NoTrunct, "no-trunc", false, "Display the extended information")
- flags.BoolVarP(&psCommand.Pod, "pod", "p", false, "Print the ID and name of the pod the containers are associated with")
- flags.BoolVarP(&psCommand.Quiet, "quiet", "q", false, "Print the numeric IDs of the containers only")
- flags.BoolVarP(&psCommand.Size, "size", "s", false, "Display the total file sizes")
- flags.StringVar(&psCommand.Sort, "sort", "created", "Sort output by command, created, id, image, names, runningfor, size, or status")
- flags.BoolVar(&psCommand.Sync, "sync", false, "Sync container state with OCI runtime")
+func psInit(command *cliconfig.PsValues) {
+ command.SetUsageTemplate(UsageTemplate())
+ flags := command.Flags()
+ flags.BoolVarP(&command.All, "all", "a", false, "Show all the containers, default is only running containers")
+ flags.StringSliceVarP(&command.Filter, "filter", "f", []string{}, "Filter output based on conditions given")
+ flags.StringVar(&command.Format, "format", "", "Pretty-print containers to JSON or using a Go template")
+ flags.IntVarP(&command.Last, "last", "n", -1, "Print the n last created containers (all states)")
+ flags.BoolVarP(&command.Latest, "latest", "l", false, "Show the latest container created (all states)")
+ flags.BoolVar(&command.Namespace, "namespace", false, "Display namespace information")
+ flags.BoolVar(&command.Namespace, "ns", false, "Display namespace information")
+ flags.BoolVar(&command.NoTrunct, "no-trunc", false, "Display the extended information")
+ flags.BoolVarP(&command.Pod, "pod", "p", false, "Print the ID and name of the pod the containers are associated with")
+ flags.BoolVarP(&command.Quiet, "quiet", "q", false, "Print the numeric IDs of the containers only")
+ flags.BoolVarP(&command.Size, "size", "s", false, "Display the total file sizes")
+ flags.StringVar(&command.Sort, "sort", "created", "Sort output by command, created, id, image, names, runningfor, size, or status")
+ flags.BoolVar(&command.Sync, "sync", false, "Sync container state with OCI runtime")
markFlagHiddenForRemoteClient("latest", flags)
}
+func init() {
+ psCommand.Command = &_psCommand
+ psInit(&psCommand)
+}
+
func psCmd(c *cliconfig.PsValues) error {
if c.Bool("trace") {
span, _ := opentracing.StartSpanFromContext(Ctx, "psCmd")
@@ -215,10 +220,6 @@ func psCmd(c *cliconfig.PsValues) error {
defer runtime.Shutdown(false)
- if len(c.InputArgs) > 0 {
- return errors.Errorf("too many arguments, ps takes no arguments")
- }
-
opts := shared.PsOptions{
All: c.All,
Format: c.Format,
diff --git a/cmd/podman/refresh.go b/cmd/podman/refresh.go
index 641748452..1e4a31a52 100644
--- a/cmd/podman/refresh.go
+++ b/cmd/podman/refresh.go
@@ -15,6 +15,7 @@ var (
refreshDescription = "The refresh command resets the state of all containers to handle database changes after a Podman upgrade. All running containers will be restarted."
_refreshCommand = &cobra.Command{
Use: "refresh",
+ Args: noSubArgs,
Short: "Refresh container state",
Long: refreshDescription,
RunE: func(cmd *cobra.Command, args []string) error {
@@ -26,15 +27,12 @@ var (
)
func init() {
+ _refreshCommand.Hidden = true
refreshCommand.Command = _refreshCommand
refreshCommand.SetUsageTemplate(UsageTemplate())
}
func refreshCmd(c *cliconfig.RefreshValues) error {
- if len(c.InputArgs) > 0 {
- return errors.Errorf("refresh does not accept any arguments")
- }
-
runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating libpod runtime")
diff --git a/cmd/podman/rmi.go b/cmd/podman/rmi.go
index e5bb9b486..511668df7 100644
--- a/cmd/podman/rmi.go
+++ b/cmd/podman/rmi.go
@@ -14,7 +14,7 @@ import (
var (
rmiCommand cliconfig.RmiValues
rmiDescription = "Removes one or more locally stored images."
- _rmiCommand = &cobra.Command{
+ _rmiCommand = cobra.Command{
Use: "rmi [flags] IMAGE [IMAGE...]",
Short: "Removes one or more images from local storage",
Long: rmiDescription,
@@ -29,12 +29,16 @@ var (
}
)
+func rmiInit(command *cliconfig.RmiValues) {
+ command.SetUsageTemplate(UsageTemplate())
+ flags := command.Flags()
+ flags.BoolVarP(&command.All, "all", "a", false, "Remove all images")
+ flags.BoolVarP(&command.Force, "force", "f", false, "Force Removal of the image")
+}
+
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")
+ rmiCommand.Command = &_rmiCommand
+ rmiInit(&rmiCommand)
}
func rmiCmd(c *cliconfig.RmiValues) error {
diff --git a/cmd/podman/runlabel.go b/cmd/podman/runlabel.go
index bc4e650f9..f91ffed0d 100644
--- a/cmd/podman/runlabel.go
+++ b/cmd/podman/runlabel.go
@@ -53,10 +53,12 @@ func init() {
flags.MarkHidden("opt2")
flags.MarkHidden("opt3")
- flags.BoolVarP(&runlabelCommand.Pull, "pull", "p", false, "Pull the image if it does not exist locally prior to executing the label contents")
+ flags.BoolP("pull", "p", false, "Pull the image if it does not exist locally prior to executing the label contents")
flags.BoolVarP(&runlabelCommand.Quiet, "quiet", "q", false, "Suppress output information when installing images")
flags.StringVar(&runlabelCommand.SignaturePolicy, "signature-policy", "", "`Pathname` of signature policy file (not usually used)")
flags.BoolVar(&runlabelCommand.TlsVerify, "tls-verify", true, "Require HTTPS and verify certificates when contacting registries (default: true)")
+
+ flags.MarkDeprecated("pull", "podman will pull if not found in local storage")
}
// installCmd gets the data from the command line and calls installImage
@@ -95,7 +97,6 @@ func runlabelCmd(c *cliconfig.RunlabelValues) error {
if len(args) > 2 {
extraArgs = args[2:]
}
- pull := c.Pull
label := args[0]
runlabelImage := args[1]
@@ -131,7 +132,7 @@ func runlabelCmd(c *cliconfig.RunlabelValues) error {
}
authfile := getAuthFile(c.Authfile)
- runLabel, imageName, err := shared.GetRunlabel(label, runlabelImage, ctx, runtime, pull, c.Creds, dockerRegistryOptions, authfile, c.SignaturePolicy, stdOut)
+ runLabel, imageName, err := shared.GetRunlabel(label, runlabelImage, ctx, runtime, true, c.Creds, dockerRegistryOptions, authfile, c.SignaturePolicy, stdOut)
if err != nil {
return err
}
diff --git a/cmd/podman/stop.go b/cmd/podman/stop.go
index ab9a2cf38..7bd160494 100644
--- a/cmd/podman/stop.go
+++ b/cmd/podman/stop.go
@@ -2,15 +2,14 @@ package main
import (
"fmt"
+ "reflect"
"github.com/containers/libpod/cmd/podman/cliconfig"
- "github.com/containers/libpod/cmd/podman/libpodruntime"
- "github.com/containers/libpod/cmd/podman/shared"
"github.com/containers/libpod/libpod"
+ "github.com/containers/libpod/pkg/adapter"
"github.com/containers/libpod/pkg/rootless"
- opentracing "github.com/opentracing/opentracing-go"
+ "github.com/opentracing/opentracing-go"
"github.com/pkg/errors"
- "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
@@ -52,63 +51,43 @@ func init() {
markFlagHiddenForRemoteClient("latest", flags)
}
+// stopCmd stops a container or containers
func stopCmd(c *cliconfig.StopValues) error {
+ if c.Flag("timeout").Changed && c.Flag("time").Changed {
+ return errors.New("the --timeout and --time flags are mutually exclusive")
+ }
+
if c.Bool("trace") {
span, _ := opentracing.StartSpanFromContext(Ctx, "stopCmd")
defer span.Finish()
}
rootless.SetSkipStorageSetup(true)
- runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(&c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
defer runtime.Shutdown(false)
- containers, err := getAllOrLatestContainers(&c.PodmanCommand, runtime, libpod.ContainerStateRunning, "running")
+ ok, failures, err := runtime.StopContainers(getContext(), c)
if err != nil {
- if len(containers) == 0 {
- return err
- }
- fmt.Println(err.Error())
+ return err
}
- if c.Flag("timeout").Changed && c.Flag("time").Changed {
- return errors.New("the --timeout and --time flags are mutually exclusive")
+ for _, id := range ok {
+ fmt.Println(id)
}
- var stopFuncs []shared.ParallelWorkerInput
- for _, ctr := range containers {
- con := ctr
- var stopTimeout uint
- if c.Flag("timeout").Changed || c.Flag("time").Changed {
- stopTimeout = c.Timeout
- } else {
- stopTimeout = ctr.StopTimeout()
- logrus.Debugf("Set timeout to container %s default (%d)", ctr.ID(), stopTimeout)
- }
- f := func() error {
- if err := con.StopWithTimeout(stopTimeout); err != nil {
- if errors.Cause(err) == libpod.ErrCtrStopped {
- logrus.Debugf("Container %s already stopped", con.ID())
- return nil
- }
- return err
- }
- return nil
- }
- stopFuncs = append(stopFuncs, shared.ParallelWorkerInput{
- ContainerID: con.ID(),
- ParallelFunc: f,
- })
- }
+ if len(failures) > 0 {
+ keys := reflect.ValueOf(failures).MapKeys()
+ lastKey := keys[len(keys)-1].String()
+ lastErr := failures[lastKey]
+ delete(failures, lastKey)
- maxWorkers := shared.Parallelize("stop")
- if c.GlobalIsSet("max-workers") {
- maxWorkers = c.GlobalFlags.MaxWorks
+ for _, err := range failures {
+ outputError(err)
+ }
+ return lastErr
}
- logrus.Debugf("Setting maximum workers to %d", maxWorkers)
-
- stopErrors, errCount := shared.ParallelExecuteWorkerPool(maxWorkers, stopFuncs)
- return printParallelOutput(stopErrors, errCount)
+ return nil
}
diff --git a/cmd/podman/system_prune.go b/cmd/podman/system_prune.go
index a823dcad1..f566387fa 100644
--- a/cmd/podman/system_prune.go
+++ b/cmd/podman/system_prune.go
@@ -23,6 +23,7 @@ var (
`
_pruneSystemCommand = &cobra.Command{
Use: "prune",
+ Args: noSubArgs,
Short: "Remove unused data",
Long: pruneSystemDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/system_renumber.go b/cmd/podman/system_renumber.go
index c8ce628b1..31137b9f6 100644
--- a/cmd/podman/system_renumber.go
+++ b/cmd/podman/system_renumber.go
@@ -18,6 +18,7 @@ var (
_renumberCommand = &cobra.Command{
Use: "renumber",
+ Args: noSubArgs,
Short: "Migrate lock numbers",
Long: renumberDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/varlink.go b/cmd/podman/varlink.go
index f19d03885..5cc79ef96 100644
--- a/cmd/podman/varlink.go
+++ b/cmd/podman/varlink.go
@@ -49,6 +49,9 @@ func varlinkCmd(c *cliconfig.VarlinkValues) error {
if len(args) < 1 {
return errors.Errorf("you must provide a varlink URI")
}
+ if len(args) > 1 {
+ return errors.Errorf("too many arguments. Requires exactly 1")
+ }
timeout := time.Duration(c.Timeout) * time.Millisecond
// Create a single runtime for varlink
diff --git a/cmd/podman/varlink/io.podman.varlink b/cmd/podman/varlink/io.podman.varlink
index 618af3481..73e6c15f9 100644
--- a/cmd/podman/varlink/io.podman.varlink
+++ b/cmd/podman/varlink/io.podman.varlink
@@ -459,6 +459,11 @@ method ListContainers() -> (containers: []Container)
# [InspectContainer](#InspectContainer).
method GetContainer(id: string) -> (container: Container)
+# GetContainersByContext allows you to get a list of container ids depending on all, latest, or a list of
+# container names. The definition of latest container means the latest by creation date. In a multi-
+# user environment, results might differ from what you expect.
+method GetContainersByContext(all: bool, latest: bool, args: []string) -> (containers: []string)
+
# CreateContainer creates a new container from an image. It uses a [Create](#Create) type for input. The minimum
# input required for CreateContainer is an image name. If the image name is not found, an [ImageNotFound](#ImageNotFound)
# error will be returned. Otherwise, the ID of the newly created container will be returned.
diff --git a/cmd/podman/version.go b/cmd/podman/version.go
index c65ba94f9..b3615ce23 100644
--- a/cmd/podman/version.go
+++ b/cmd/podman/version.go
@@ -17,6 +17,7 @@ var (
versionCommand cliconfig.VersionValues
_versionCommand = &cobra.Command{
Use: "version",
+ Args: noSubArgs,
Short: "Display the Podman Version Information",
RunE: func(cmd *cobra.Command, args []string) error {
versionCommand.InputArgs = args
diff --git a/cmd/podman/volume_ls.go b/cmd/podman/volume_ls.go
index 5adfc1e91..6855f38e0 100644
--- a/cmd/podman/volume_ls.go
+++ b/cmd/podman/volume_ls.go
@@ -49,6 +49,7 @@ and the output format can be changed to JSON or a user specified Go template.
_volumeLsCommand = &cobra.Command{
Use: "ls",
Aliases: []string{"list"},
+ Args: noSubArgs,
Short: "List volumes",
Long: volumeLsDescription,
RunE: func(cmd *cobra.Command, args []string) error {
@@ -76,10 +77,6 @@ func volumeLsCmd(c *cliconfig.VolumeLsValues) error {
}
defer runtime.Shutdown(false)
- if len(c.InputArgs) > 0 {
- return errors.Errorf("too many arguments, ls takes no arguments")
- }
-
opts := volumeLsOptions{
Quiet: c.Quiet,
}
diff --git a/cmd/podman/volume_prune.go b/cmd/podman/volume_prune.go
index 1f7931aa4..370f072eb 100644
--- a/cmd/podman/volume_prune.go
+++ b/cmd/podman/volume_prune.go
@@ -24,6 +24,7 @@ using force.
`
_volumePruneCommand = &cobra.Command{
Use: "prune",
+ Args: noSubArgs,
Short: "Remove all unused volumes",
Long: volumePruneDescription,
RunE: func(cmd *cobra.Command, args []string) error {