summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.cirrus.yml5
-rw-r--r--README.md3
-rw-r--r--cmd/podman/attach.go2
-rw-r--r--cmd/podman/build.go2
-rw-r--r--cmd/podman/checkpoint.go8
-rw-r--r--cmd/podman/cleanup.go2
-rw-r--r--cmd/podman/cliconfig/commands.go56
-rw-r--r--cmd/podman/commands.go11
-rw-r--r--cmd/podman/commit.go2
-rw-r--r--cmd/podman/common.go2
-rw-r--r--cmd/podman/container.go2
-rw-r--r--cmd/podman/cp.go2
-rw-r--r--cmd/podman/create.go40
-rw-r--r--cmd/podman/diff.go2
-rw-r--r--cmd/podman/exec.go12
-rw-r--r--cmd/podman/exists.go18
-rw-r--r--cmd/podman/export.go2
-rw-r--r--cmd/podman/generate_kube.go2
-rw-r--r--cmd/podman/history.go2
-rw-r--r--cmd/podman/image.go13
-rw-r--r--cmd/podman/images.go7
-rw-r--r--cmd/podman/import.go2
-rw-r--r--cmd/podman/inspect.go2
-rw-r--r--cmd/podman/kill.go2
-rw-r--r--cmd/podman/libpodruntime/runtime.go18
-rw-r--r--cmd/podman/load.go2
-rw-r--r--cmd/podman/login.go2
-rw-r--r--cmd/podman/logout.go2
-rw-r--r--cmd/podman/logs.go2
-rw-r--r--cmd/podman/main.go4
-rw-r--r--cmd/podman/mount.go2
-rw-r--r--cmd/podman/pause.go4
-rw-r--r--cmd/podman/play_kube.go2
-rw-r--r--cmd/podman/pod_inspect.go2
-rw-r--r--cmd/podman/pod_kill.go2
-rw-r--r--cmd/podman/pod_pause.go2
-rw-r--r--cmd/podman/pod_restart.go2
-rw-r--r--cmd/podman/pod_rm.go2
-rw-r--r--cmd/podman/pod_start.go2
-rw-r--r--cmd/podman/pod_stats.go2
-rw-r--r--cmd/podman/pod_stop.go2
-rw-r--r--cmd/podman/pod_top.go2
-rw-r--r--cmd/podman/pod_unpause.go2
-rw-r--r--cmd/podman/port.go8
-rw-r--r--cmd/podman/ps.go11
-rw-r--r--cmd/podman/pull.go2
-rw-r--r--cmd/podman/push.go2
-rw-r--r--cmd/podman/restart.go4
-rw-r--r--cmd/podman/restore.go2
-rw-r--r--cmd/podman/rm.go2
-rw-r--r--cmd/podman/rmi.go25
-rw-r--r--cmd/podman/run.go2
-rw-r--r--cmd/podman/runlabel.go2
-rw-r--r--cmd/podman/save.go2
-rw-r--r--cmd/podman/search.go2
-rw-r--r--cmd/podman/sign.go2
-rw-r--r--cmd/podman/start.go2
-rw-r--r--cmd/podman/stats.go2
-rw-r--r--cmd/podman/stop.go16
-rw-r--r--cmd/podman/tag.go2
-rw-r--r--cmd/podman/top.go2
-rw-r--r--cmd/podman/trust_set_show.go4
-rw-r--r--cmd/podman/umount.go2
-rw-r--r--cmd/podman/unpause.go2
-rw-r--r--cmd/podman/varlink.go2
-rw-r--r--cmd/podman/volume_create.go2
-rw-r--r--cmd/podman/volume_inspect.go2
-rw-r--r--cmd/podman/volume_rm.go2
-rw-r--r--cmd/podman/wait.go2
-rw-r--r--contrib/gate/Dockerfile2
-rw-r--r--docs/podman-container.1.md67
-rw-r--r--docs/podman-generate.1.md2
-rw-r--r--docs/podman-image.1.md36
-rw-r--r--docs/podman-import.1.md3
-rw-r--r--docs/podman-play.1.md2
-rw-r--r--docs/podman-pod-stats.1.md92
-rw-r--r--docs/podman-pod.1.md28
-rw-r--r--docs/podman-system.1.md3
-rw-r--r--docs/podman-volume.1.md17
-rw-r--r--docs/podman.1.md12
-rwxr-xr-xhack/podman-commands.sh40
-rw-r--r--libpod/container_api.go5
-rw-r--r--libpod/oci.go16
-rw-r--r--libpod/runtime.go15
-rw-r--r--pkg/adapter/runtime.go8
-rw-r--r--pkg/adapter/runtime_remote.go12
-rw-r--r--pkg/rootless/rootless_linux.go3
-rw-r--r--pkg/secrets/secrets.go12
-rw-r--r--pkg/util/utils.go26
-rw-r--r--remote_client.md77
-rwxr-xr-xtest/test_podman_baseline.sh2
91 files changed, 580 insertions, 267 deletions
diff --git a/.cirrus.yml b/.cirrus.yml
index ad9edd404..4521866d1 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -118,6 +118,11 @@ gating_task:
- '/usr/local/bin/entrypoint.sh vendor'
- 'cd /go/src/github.com/containers/libpod && ./hack/tree_status.sh'
+ # This task builds Podman with different buildtags to ensure the build does
+ # not break.
+ build_script:
+ - '/usr/local/bin/entrypoint.sh clean podman BUILDTAGS="exclude_graphdriver_devicemapper selinux seccomp"'
+
build_each_commit_task:
diff --git a/README.md b/README.md
index 97c548ddd..636a6fa5b 100644
--- a/README.md
+++ b/README.md
@@ -82,6 +82,9 @@ includes tables showing Docker commands and their Podman equivalent commands.
**[Tutorials](docs/tutorials)**
Tutorials on using Podman.
+**[Remote Client](remote_client.md)**
+A brief how-to on using the Podman remote-client.
+
**[Release Notes](RELEASE_NOTES.md)**
Release notes for recent Podman versions
diff --git a/cmd/podman/attach.go b/cmd/podman/attach.go
index 074675e45..a22aa92a1 100644
--- a/cmd/podman/attach.go
+++ b/cmd/podman/attach.go
@@ -14,7 +14,7 @@ var (
attachCommand cliconfig.AttachValues
attachDescription = "The podman attach command allows you to attach to a running container using the container's ID or name, either to view its ongoing output or to control it interactively."
_attachCommand = &cobra.Command{
- Use: "attach",
+ Use: "attach [flags] CONTAINER",
Short: "Attach to a running container",
Long: attachDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/build.go b/cmd/podman/build.go
index e40e35cb5..8ea9e6957 100644
--- a/cmd/podman/build.go
+++ b/cmd/podman/build.go
@@ -27,7 +27,7 @@ var (
namespaceValues buildahcli.NameSpaceResults
_buildCommand = &cobra.Command{
- Use: "build",
+ Use: "build [flags] CONTEXT",
Short: "Build an image using instructions from Dockerfiles",
Long: buildDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/checkpoint.go b/cmd/podman/checkpoint.go
index c9de5638b..367065766 100644
--- a/cmd/podman/checkpoint.go
+++ b/cmd/podman/checkpoint.go
@@ -21,7 +21,7 @@ var (
Checkpoints one or more running containers. The container name or ID can be used.
`
_checkpointCommand = &cobra.Command{
- Use: "checkpoint",
+ Use: "checkpoint [flags] CONTAINER [CONTAINER...]",
Short: "Checkpoints one or more containers",
Long: checkpointDescription,
RunE: func(cmd *cobra.Command, args []string) error {
@@ -32,9 +32,9 @@ var (
Args: func(cmd *cobra.Command, args []string) error {
return checkAllAndLatest(cmd, args, false)
},
- Example: `podman checkpoint --keep ctrID
- podman checkpoint --all
- podman checkpoint --leave-running --latest`,
+ Example: `podman container checkpoint --keep ctrID
+ podman container checkpoint --all
+ podman container checkpoint --leave-running --latest`,
}
)
diff --git a/cmd/podman/cleanup.go b/cmd/podman/cleanup.go
index 33d456643..fbbd337a7 100644
--- a/cmd/podman/cleanup.go
+++ b/cmd/podman/cleanup.go
@@ -18,7 +18,7 @@ var (
Cleans up mount points and network stacks on one or more containers from the host. The container name or ID can be used. This command is used internally when running containers, but can also be used if container cleanup has failed when a container exits.
`
_cleanupCommand = &cobra.Command{
- Use: "cleanup",
+ Use: "cleanup [flags] CONTAINER [CONTAINER...]",
Short: "Cleanup network and mountpoints of one or more containers",
Long: cleanupDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/cliconfig/commands.go b/cmd/podman/cliconfig/commands.go
index 7d1e762d9..3361c14b8 100644
--- a/cmd/podman/cliconfig/commands.go
+++ b/cmd/podman/cliconfig/commands.go
@@ -1,5 +1,7 @@
package cliconfig
+import "github.com/sirupsen/logrus"
+
// GlobalIsSet is a compatibility method for urfave
func (p *PodmanCommand) GlobalIsSet(opt string) bool {
flag := p.PersistentFlags().Lookup(opt)
@@ -22,9 +24,13 @@ func (p *PodmanCommand) IsSet(opt string) bool {
func (p *PodmanCommand) Bool(opt string) bool {
flag := p.Flags().Lookup(opt)
if flag == nil {
+ logrus.Errorf("Could not find flag %s", opt)
return false
}
- val, _ := p.Flags().GetBool(opt)
+ val, err := p.Flags().GetBool(opt)
+ if err != nil {
+ logrus.Errorf("Error getting flag %s: %v", opt, err)
+ }
return val
}
@@ -32,9 +38,13 @@ func (p *PodmanCommand) Bool(opt string) bool {
func (p *PodmanCommand) String(opt string) string {
flag := p.Flags().Lookup(opt)
if flag == nil {
+ logrus.Errorf("Could not find flag %s", opt)
return ""
}
- val, _ := p.Flags().GetString(opt)
+ val, err := p.Flags().GetString(opt)
+ if err != nil {
+ logrus.Errorf("Error getting flag %s: %v", opt, err)
+ }
return val
}
@@ -42,9 +52,13 @@ func (p *PodmanCommand) String(opt string) string {
func (p *PodmanCommand) StringArray(opt string) []string {
flag := p.Flags().Lookup(opt)
if flag == nil {
+ logrus.Errorf("Could not find flag %s", opt)
return []string{}
}
- val, _ := p.Flags().GetStringArray(opt)
+ val, err := p.Flags().GetStringArray(opt)
+ if err != nil {
+ logrus.Errorf("Error getting flag %s: %v", opt, err)
+ }
return val
}
@@ -52,9 +66,13 @@ func (p *PodmanCommand) StringArray(opt string) []string {
func (p *PodmanCommand) StringSlice(opt string) []string {
flag := p.Flags().Lookup(opt)
if flag == nil {
+ logrus.Errorf("Could not find flag %s", opt)
return []string{}
}
- val, _ := p.Flags().GetStringSlice(opt)
+ val, err := p.Flags().GetStringSlice(opt)
+ if err != nil {
+ logrus.Errorf("Error getting flag %s: %v", opt, err)
+ }
return val
}
@@ -62,9 +80,13 @@ func (p *PodmanCommand) StringSlice(opt string) []string {
func (p *PodmanCommand) Int(opt string) int {
flag := p.Flags().Lookup(opt)
if flag == nil {
+ logrus.Errorf("Could not find flag %s", opt)
return 0
}
- val, _ := p.Flags().GetInt(opt)
+ val, err := p.Flags().GetInt(opt)
+ if err != nil {
+ logrus.Errorf("Error getting flag %s: %v", opt, err)
+ }
return val
}
@@ -72,9 +94,13 @@ func (p *PodmanCommand) Int(opt string) int {
func (p *PodmanCommand) Uint(opt string) uint {
flag := p.Flags().Lookup(opt)
if flag == nil {
+ logrus.Errorf("Could not find flag %s", opt)
return 0
}
- val, _ := p.Flags().GetUint(opt)
+ val, err := p.Flags().GetUint(opt)
+ if err != nil {
+ logrus.Errorf("Error getting flag %s: %v", opt, err)
+ }
return val
}
@@ -82,9 +108,13 @@ func (p *PodmanCommand) Uint(opt string) uint {
func (p *PodmanCommand) Int64(opt string) int64 {
flag := p.Flags().Lookup(opt)
if flag == nil {
+ logrus.Errorf("Could not find flag %s", opt)
return 0
}
- val, _ := p.Flags().GetInt64(opt)
+ val, err := p.Flags().GetInt64(opt)
+ if err != nil {
+ logrus.Errorf("Error getting flag %s: %v", opt, err)
+ }
return val
}
@@ -92,9 +122,13 @@ func (p *PodmanCommand) Int64(opt string) int64 {
func (p *PodmanCommand) Uint64(opt string) uint64 {
flag := p.Flags().Lookup(opt)
if flag == nil {
+ logrus.Errorf("Could not find flag %s", opt)
return 0
}
- val, _ := p.Flags().GetUint64(opt)
+ val, err := p.Flags().GetUint64(opt)
+ if err != nil {
+ logrus.Errorf("Error getting flag %s: %v", opt, err)
+ }
return val
}
@@ -102,8 +136,12 @@ func (p *PodmanCommand) Uint64(opt string) uint64 {
func (p *PodmanCommand) Float64(opt string) float64 {
flag := p.Flags().Lookup(opt)
if flag == nil {
+ logrus.Errorf("Could not find flag %s", opt)
return 0
}
- val, _ := p.Flags().GetFloat64(opt)
+ val, err := p.Flags().GetFloat64(opt)
+ if err != nil {
+ logrus.Errorf("Error getting flag %s: %v", opt, err)
+ }
return val
}
diff --git a/cmd/podman/commands.go b/cmd/podman/commands.go
index fadcca689..2f9a9cfe2 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,
@@ -27,11 +27,9 @@ func getMainCommands() []*cobra.Command {
_portCommand,
_refreshCommand,
_restartCommand,
- _restoreCommand,
_rmCommand,
_runCommand,
_searchCommand,
- _signCommand,
_startCommand,
_statsCommand,
_stopCommand,
@@ -50,13 +48,16 @@ func getMainCommands() []*cobra.Command {
// Commands that the local client implements
func getImageSubCommands() []*cobra.Command {
return []*cobra.Command{
- _loadCommand,
_signCommand,
}
}
// Commands that the local client implements
func getContainerSubCommands() []*cobra.Command {
+
+ var _listSubCommand = _psCommand
+ _listSubCommand.Use = "list"
+
return []*cobra.Command{
_attachCommand,
_checkpointCommand,
@@ -67,8 +68,8 @@ func getContainerSubCommands() []*cobra.Command {
_execCommand,
_exportCommand,
_killCommand,
+ &_listSubCommand,
_logsCommand,
- _psCommand,
_mountCommand,
_pauseCommand,
_portCommand,
diff --git a/cmd/podman/commit.go b/cmd/podman/commit.go
index d8ced0e36..43c54c320 100644
--- a/cmd/podman/commit.go
+++ b/cmd/podman/commit.go
@@ -25,7 +25,7 @@ var (
and make changes to the instructions with the --change flag.`
_commitCommand = &cobra.Command{
- Use: "commit",
+ Use: "commit [flags] CONTAINER IMAGE",
Short: "Create new image based on the changed container",
Long: commitDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/common.go b/cmd/podman/common.go
index e297f3921..f9dfa3759 100644
--- a/cmd/podman/common.go
+++ b/cmd/podman/common.go
@@ -415,7 +415,7 @@ func getCreateFlags(c *cliconfig.PodmanCommand) {
"stop-signal", "",
"Signal to stop a container. Default is SIGTERM",
)
- createFlags.Int(
+ createFlags.Uint(
"stop-timeout", libpod.CtrRemoveTimeout,
"Timeout (in seconds) to stop a container. Default is 10",
)
diff --git a/cmd/podman/container.go b/cmd/podman/container.go
index d2450fdd3..338bb005c 100644
--- a/cmd/podman/container.go
+++ b/cmd/podman/container.go
@@ -18,11 +18,13 @@ var containerCommand = cliconfig.PodmanCommand{
// Commands that are universally implemented.
var containerCommands = []*cobra.Command{
_containerExistsCommand,
+ _inspectCommand,
}
func init() {
containerCommand.AddCommand(containerCommands...)
containerCommand.AddCommand(getContainerSubCommands()...)
containerCommand.SetUsageTemplate(UsageTemplate())
+
rootCmd.AddCommand(containerCommand.Command)
}
diff --git a/cmd/podman/cp.go b/cmd/podman/cp.go
index d9f230b67..30b6d75d2 100644
--- a/cmd/podman/cp.go
+++ b/cmd/podman/cp.go
@@ -29,7 +29,7 @@ var (
cpDescription = "Copy files/folders between a container and the local filesystem"
_cpCommand = &cobra.Command{
- Use: "cp",
+ Use: "cp [flags] SRC_PATH DEST_PATH",
Short: "Copy files/folders between a container and the local filesystem",
Long: cpDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/create.go b/cmd/podman/create.go
index 868f90d54..95cb732d9 100644
--- a/cmd/podman/create.go
+++ b/cmd/podman/create.go
@@ -42,7 +42,7 @@ var (
" any time with the podman start <container_id> command. The container" +
" will be created with the initial state 'created'."
_createCommand = &cobra.Command{
- Use: "create",
+ Use: "create [flags] IMAGE [COMMAND [ARG...]]",
Short: "Create but do not start a container",
Long: createDescription,
RunE: func(cmd *cobra.Command, args []string) error {
@@ -67,7 +67,7 @@ func init() {
getCreateFlags(&createCommand.PodmanCommand)
flags := createCommand.Flags()
- flags.SetInterspersed(true)
+ flags.SetInterspersed(false)
}
@@ -408,7 +408,7 @@ func parseCreateOpts(ctx context.Context, c *cliconfig.PodmanCommand, runtime *l
return nil, err
}
- if err = parseVolumesFrom(c.StringArray("volumes-from")); err != nil {
+ if err = parseVolumesFrom(c.StringSlice("volumes-from")); err != nil {
return nil, err
}
@@ -707,23 +707,23 @@ func parseCreateOpts(ctx context.Context, c *cliconfig.PodmanCommand, runtime *l
Entrypoint: entrypoint,
Env: env,
//ExposedPorts: ports,
- GroupAdd: c.StringSlice("group-add"),
- Hostname: c.String("hostname"),
- HostAdd: c.StringSlice("add-host"),
- IDMappings: idmappings,
- Image: imageName,
- ImageID: imageID,
- Interactive: c.Bool("interactive"),
- IP6Address: c.String("ipv6"),
- IPAddress: c.String("ip"),
- Labels: labels,
- LinkLocalIP: c.StringSlice("link-local-ip"),
- LogDriver: c.String("log-driver"),
- LogDriverOpt: c.StringSlice("log-opt"),
- MacAddress: c.String("mac-address"),
- Name: c.String("name"),
- Network: network,
- NetworkAlias: c.StringSlice("network-alias"),
+ GroupAdd: c.StringSlice("group-add"),
+ Hostname: c.String("hostname"),
+ HostAdd: c.StringSlice("add-host"),
+ IDMappings: idmappings,
+ Image: imageName,
+ ImageID: imageID,
+ Interactive: c.Bool("interactive"),
+ //IP6Address: c.String("ipv6"), // Not implemented yet - needs CNI support for static v6
+ IPAddress: c.String("ip"),
+ Labels: labels,
+ //LinkLocalIP: c.StringSlice("link-local-ip"), // Not implemented yet
+ LogDriver: c.String("log-driver"),
+ LogDriverOpt: c.StringSlice("log-opt"),
+ MacAddress: c.String("mac-address"),
+ Name: c.String("name"),
+ Network: network,
+ //NetworkAlias: c.StringSlice("network-alias"), // Not implemented - does this make sense in Podman?
IpcMode: ipcMode,
NetMode: netMode,
UtsMode: utsMode,
diff --git a/cmd/podman/diff.go b/cmd/podman/diff.go
index e2d258ad4..e232d7e66 100644
--- a/cmd/podman/diff.go
+++ b/cmd/podman/diff.go
@@ -38,7 +38,7 @@ var (
container or image will be compared to its parent layer`)
_diffCommand = &cobra.Command{
- Use: "diff",
+ Use: "diff [flags] CONTAINER | IMAGE",
Short: "Inspect changes on container's file systems",
Long: diffDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/exec.go b/cmd/podman/exec.go
index 7040a7b09..4917fb606 100644
--- a/cmd/podman/exec.go
+++ b/cmd/podman/exec.go
@@ -21,7 +21,7 @@ var (
Run a command in a running container
`
_execCommand = &cobra.Command{
- Use: "exec",
+ Use: "exec [flags] CONTAINER [COMMAND [ARG...]]",
Short: "Run a process in a running container",
Long: execDescription,
RunE: func(cmd *cobra.Command, args []string) error {
@@ -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/exists.go b/cmd/podman/exists.go
index 74a4c841b..109831e74 100644
--- a/cmd/podman/exists.go
+++ b/cmd/podman/exists.go
@@ -32,7 +32,7 @@ var (
Check if a pod exists in local storage
`
_imageExistsCommand = &cobra.Command{
- Use: "exists",
+ Use: "exists IMAGE",
Short: "Check if an image exists in local storage",
Long: imageExistsDescription,
RunE: func(cmd *cobra.Command, args []string) error {
@@ -40,11 +40,12 @@ var (
imageExistsCommand.GlobalFlags = MainGlobalOpts
return imageExistsCmd(&imageExistsCommand)
},
- Example: `podman image exists imageID`,
+ Example: `podman image exists imageID
+ podman image exists alpine || podman pull alpine`,
}
_containerExistsCommand = &cobra.Command{
- Use: "exists",
+ Use: "exists CONTAINER",
Short: "Check if a container exists in local storage",
Long: containerExistsDescription,
RunE: func(cmd *cobra.Command, args []string) error {
@@ -53,11 +54,12 @@ var (
return containerExistsCmd(&containerExistsCommand)
},
- Example: `podman container exists containerID`,
+ Example: `podman container exists containerID
+ podman container exists myctr || podman run --name myctr [etc...]`,
}
_podExistsCommand = &cobra.Command{
- Use: "exists",
+ Use: "exists POD",
Short: "Check if a pod exists in local storage",
Long: podExistsDescription,
RunE: func(cmd *cobra.Command, args []string) error {
@@ -65,16 +67,20 @@ var (
podExistsCommand.GlobalFlags = MainGlobalOpts
return podExistsCmd(&podExistsCommand)
},
- Example: `podman pod exists podID`,
+ Example: `podman pod exists podID
+ podman pod exists mypod || podman pod create --name mypod`,
}
)
func init() {
imageExistsCommand.Command = _imageExistsCommand
+ imageExistsCommand.DisableFlagsInUseLine = true
imageExistsCommand.SetUsageTemplate(UsageTemplate())
containerExistsCommand.Command = _containerExistsCommand
+ containerExistsCommand.DisableFlagsInUseLine = true
containerExistsCommand.SetUsageTemplate(UsageTemplate())
podExistsCommand.Command = _podExistsCommand
+ podExistsCommand.DisableFlagsInUseLine = true
podExistsCommand.SetUsageTemplate(UsageTemplate())
}
diff --git a/cmd/podman/export.go b/cmd/podman/export.go
index 5873bad3d..d40c05019 100644
--- a/cmd/podman/export.go
+++ b/cmd/podman/export.go
@@ -17,7 +17,7 @@ var (
" and saves it on the local machine."
_exportCommand = &cobra.Command{
- Use: "export",
+ Use: "export [flags] CONTAINER",
Short: "Export container's filesystem contents as a tar archive",
Long: exportDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/generate_kube.go b/cmd/podman/generate_kube.go
index 15f374c73..fa2872b77 100644
--- a/cmd/podman/generate_kube.go
+++ b/cmd/podman/generate_kube.go
@@ -17,7 +17,7 @@ var (
containerKubeCommand cliconfig.GenerateKubeValues
containerKubeDescription = "Generate Kubernetes Pod YAML"
_containerKubeCommand = &cobra.Command{
- Use: "kube",
+ Use: "kube [flags] CONTAINER | POD",
Short: "Generate Kubernetes pod YAML for a container or pod",
Long: containerKubeDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/history.go b/cmd/podman/history.go
index 103ef08e8..533ee91cb 100644
--- a/cmd/podman/history.go
+++ b/cmd/podman/history.go
@@ -40,7 +40,7 @@ var (
historyDescription = "Displays the history of an image. The information can be printed out in an easy to read, " +
"or user specified format, and can be truncated."
_historyCommand = &cobra.Command{
- Use: "history",
+ Use: "history [flags] IMAGE",
Short: "Show history of a specified image",
Long: historyDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/image.go b/cmd/podman/image.go
index 14053cb0d..b5c1c3ccf 100644
--- a/cmd/podman/image.go
+++ b/cmd/podman/image.go
@@ -14,6 +14,8 @@ var (
Long: imageDescription,
},
}
+ _imagesSubCommand = _imagesCommand
+ _rmSubCommand = _rmiCommand
)
//imageSubCommands are implemented both in local and remote clients
@@ -21,14 +23,12 @@ var imageSubCommands = []*cobra.Command{
_buildCommand,
_historyCommand,
_imageExistsCommand,
- _imagesCommand,
_importCommand,
_inspectCommand,
_loadCommand,
_pruneImagesCommand,
_pullCommand,
_pushCommand,
- _rmiCommand,
_saveCommand,
_tagCommand,
}
@@ -37,4 +37,13 @@ func init() {
imageCommand.SetUsageTemplate(UsageTemplate())
imageCommand.AddCommand(imageSubCommands...)
imageCommand.AddCommand(getImageSubCommands()...)
+
+ // Setup of "images" to appear as "list"
+ _imagesSubCommand.Use = "list"
+ _imagesSubCommand.Aliases = []string{"ls"}
+ imageCommand.AddCommand(&_imagesSubCommand)
+
+ // Setup of "rmi" to appears as "rm"
+ _rmSubCommand.Use = "rm"
+ imageCommand.AddCommand(&_rmSubCommand)
}
diff --git a/cmd/podman/images.go b/cmd/podman/images.go
index 6e82195a9..e6f4d9a60 100644
--- a/cmd/podman/images.go
+++ b/cmd/podman/images.go
@@ -87,8 +87,8 @@ var (
imagesCommand cliconfig.ImagesValues
imagesDescription = "lists locally stored images."
- _imagesCommand = &cobra.Command{
- Use: "images",
+ _imagesCommand = cobra.Command{
+ Use: "images [flags] [IMAGE]",
Short: "List images in local storage",
Long: imagesDescription,
RunE: func(cmd *cobra.Command, args []string) error {
@@ -103,8 +103,9 @@ var (
)
func init() {
- imagesCommand.Command = _imagesCommand
+ 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")
diff --git a/cmd/podman/import.go b/cmd/podman/import.go
index a64b03d6d..ddf1bd802 100644
--- a/cmd/podman/import.go
+++ b/cmd/podman/import.go
@@ -17,7 +17,7 @@ var (
Optionally tag the image. You can specify the instructions using the --change option.
`
_importCommand = &cobra.Command{
- Use: "import",
+ Use: "import [flags] PATH [REFERENCE]",
Short: "Import a tarball to create a filesystem image",
Long: importDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/inspect.go b/cmd/podman/inspect.go
index 46883b31d..1c93a03e1 100644
--- a/cmd/podman/inspect.go
+++ b/cmd/podman/inspect.go
@@ -26,7 +26,7 @@ var (
inspectDescription = "This displays the low-level information on containers and images identified by name or ID. By default, this will render all results in a JSON array. If the container and image have the same name, this will return container JSON for unspecified type."
_inspectCommand = &cobra.Command{
- Use: "inspect",
+ Use: "inspect [flags] CONTAINER | IMAGE",
Short: "Display the configuration of a container or image",
Long: inspectDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/kill.go b/cmd/podman/kill.go
index eb72d53e7..76d2516b7 100644
--- a/cmd/podman/kill.go
+++ b/cmd/podman/kill.go
@@ -20,7 +20,7 @@ var (
killDescription = "The main process inside each container specified will be sent SIGKILL, or any signal specified with option --signal."
_killCommand = &cobra.Command{
- Use: "kill",
+ Use: "kill [flags] CONTAINER [CONTAINER...]",
Short: "Kill one or more running containers with a specific signal",
Long: killDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/libpodruntime/runtime.go b/cmd/podman/libpodruntime/runtime.go
index f4ddf3521..2b96f0c20 100644
--- a/cmd/podman/libpodruntime/runtime.go
+++ b/cmd/podman/libpodruntime/runtime.go
@@ -5,6 +5,7 @@ import (
"github.com/containers/libpod/libpod"
"github.com/containers/libpod/pkg/rootless"
"github.com/containers/libpod/pkg/util"
+ "github.com/containers/storage"
"github.com/pkg/errors"
)
@@ -20,11 +21,8 @@ func GetRuntime(c *cliconfig.PodmanCommand) (*libpod.Runtime, error) {
func getRuntime(c *cliconfig.PodmanCommand, renumber bool) (*libpod.Runtime, error) {
options := []libpod.RuntimeOption{}
-
- storageOpts, _, err := util.GetDefaultStoreOptions()
- if err != nil {
- return nil, err
- }
+ storageOpts := storage.StoreOptions{}
+ storageSet := false
uidmapFlag := c.Flags().Lookup("uidmap")
gidmapFlag := c.Flags().Lookup("gidmap")
@@ -43,25 +41,33 @@ func getRuntime(c *cliconfig.PodmanCommand, renumber bool) (*libpod.Runtime, err
storageOpts.UIDMap = mappings.UIDMap
storageOpts.GIDMap = mappings.GIDMap
+ storageSet = true
}
if c.Flags().Changed("root") {
+ storageSet = true
storageOpts.GraphRoot = c.GlobalFlags.Root
}
if c.Flags().Changed("runroot") {
+ storageSet = true
storageOpts.RunRoot = c.GlobalFlags.Runroot
}
if len(storageOpts.RunRoot) > 50 {
return nil, errors.New("the specified runroot is longer than 50 characters")
}
if c.Flags().Changed("storage-driver") {
+ storageSet = true
storageOpts.GraphDriverName = c.GlobalFlags.StorageDriver
}
if len(c.GlobalFlags.StorageOpts) > 0 {
+ storageSet = true
storageOpts.GraphDriverOptions = c.GlobalFlags.StorageOpts
}
- options = append(options, libpod.WithStorageConfig(storageOpts))
+ // Only set this if the user changes storage config on the command line
+ if storageSet {
+ options = append(options, libpod.WithStorageConfig(storageOpts))
+ }
// TODO CLI flags for image config?
// TODO CLI flag for signature policy?
diff --git a/cmd/podman/load.go b/cmd/podman/load.go
index 272cd78d2..5a0742aba 100644
--- a/cmd/podman/load.go
+++ b/cmd/podman/load.go
@@ -17,7 +17,7 @@ var (
loadDescription = "Loads the image from docker-archive stored on the local machine."
_loadCommand = &cobra.Command{
- Use: "load",
+ Use: "load [flags] [PATH]",
Short: "Load an image from docker archive",
Long: loadDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/login.go b/cmd/podman/login.go
index b02a4b3f9..48d4eefbc 100644
--- a/cmd/podman/login.go
+++ b/cmd/podman/login.go
@@ -21,7 +21,7 @@ var (
loginDescription = "Login to a container registry on a specified server."
_loginCommand = &cobra.Command{
- Use: "login",
+ Use: "login [flags] REGISTRY",
Short: "Login to a container registry",
Long: loginDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/logout.go b/cmd/podman/logout.go
index 4108887f0..2a540ceba 100644
--- a/cmd/podman/logout.go
+++ b/cmd/podman/logout.go
@@ -14,7 +14,7 @@ var (
logoutCommand cliconfig.LogoutValues
logoutDescription = "Remove the cached username and password for the registry."
_logoutCommand = &cobra.Command{
- Use: "logout",
+ Use: "logout [flags] REGISTRY",
Short: "Logout of a container registry",
Long: logoutDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/logs.go b/cmd/podman/logs.go
index 40ae2c846..a02010eda 100644
--- a/cmd/podman/logs.go
+++ b/cmd/podman/logs.go
@@ -18,7 +18,7 @@ var (
logsDescription = "The podman logs command batch-retrieves whatever logs are present for a container at the time of execution. This does not guarantee execution" +
"order when combined with podman run (i.e. your run may not have generated any logs at the time you execute podman logs"
_logsCommand = &cobra.Command{
- Use: "logs",
+ Use: "logs [flags] CONTAINER",
Short: "Fetch the logs of a container",
Long: logsDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/main.go b/cmd/podman/main.go
index 19bdb40d6..98e2f23ca 100644
--- a/cmd/podman/main.go
+++ b/cmd/podman/main.go
@@ -38,7 +38,7 @@ var mainCommands = []*cobra.Command{
_buildCommand,
_exportCommand,
_historyCommand,
- _imagesCommand,
+ &_imagesCommand,
_importCommand,
_infoCommand,
_inspectCommand,
@@ -47,7 +47,7 @@ var mainCommands = []*cobra.Command{
podCommand.Command,
_pullCommand,
_pushCommand,
- _rmiCommand,
+ &_rmiCommand,
_saveCommand,
_tagCommand,
_versionCommand,
diff --git a/cmd/podman/mount.go b/cmd/podman/mount.go
index f4a7bd5ea..3a3432194 100644
--- a/cmd/podman/mount.go
+++ b/cmd/podman/mount.go
@@ -26,7 +26,7 @@ var (
`
_mountCommand = &cobra.Command{
- Use: "mount",
+ Use: "mount [flags] CONTAINER",
Short: "Mount a working container's root filesystem",
Long: mountDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/pause.go b/cmd/podman/pause.go
index 94bb0edfe..3a5b80359 100644
--- a/cmd/podman/pause.go
+++ b/cmd/podman/pause.go
@@ -20,7 +20,7 @@ var (
Pauses one or more running containers. The container name or ID can be used.
`
_pauseCommand = &cobra.Command{
- Use: "pause",
+ Use: "pause [flags] CONTAINER [CONTAINER...]",
Short: "Pause all the processes in one or more containers",
Long: pauseDescription,
RunE: func(cmd *cobra.Command, args []string) error {
@@ -30,7 +30,7 @@ var (
},
Example: `podman pause mywebserver
podman pause 860a4b23
- podman stop -a`,
+ podman pause -a`,
}
)
diff --git a/cmd/podman/play_kube.go b/cmd/podman/play_kube.go
index 1a45cbed9..6f23e340e 100644
--- a/cmd/podman/play_kube.go
+++ b/cmd/podman/play_kube.go
@@ -29,7 +29,7 @@ var (
playKubeCommand cliconfig.KubePlayValues
playKubeDescription = "Play a Pod and its containers based on a Kubrernetes YAML"
_playKubeCommand = &cobra.Command{
- Use: "kube",
+ Use: "kube [flags] KUBEFILE",
Short: "Play a pod based on Kubernetes YAML",
Long: playKubeDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/pod_inspect.go b/cmd/podman/pod_inspect.go
index 5a32b5c5d..8b2747af0 100644
--- a/cmd/podman/pod_inspect.go
+++ b/cmd/podman/pod_inspect.go
@@ -14,7 +14,7 @@ var (
podInspectCommand cliconfig.PodInspectValues
podInspectDescription = "Display the configuration for a pod by name or id"
_podInspectCommand = &cobra.Command{
- Use: "inspect",
+ Use: "inspect [flags] POD",
Short: "Displays a pod configuration",
Long: podInspectDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/pod_kill.go b/cmd/podman/pod_kill.go
index aaaae0f7d..70d86d186 100644
--- a/cmd/podman/pod_kill.go
+++ b/cmd/podman/pod_kill.go
@@ -16,7 +16,7 @@ var (
podKillCommand cliconfig.PodKillValues
podKillDescription = "The main process of each container inside the specified pod will be sent SIGKILL, or any signal specified with option --signal."
_podKillCommand = &cobra.Command{
- Use: "kill",
+ Use: "kill [flags] POD [POD...]",
Short: "Send the specified signal or SIGKILL to containers in pod",
Long: podKillDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/pod_pause.go b/cmd/podman/pod_pause.go
index 284740d22..f7c90dbbe 100644
--- a/cmd/podman/pod_pause.go
+++ b/cmd/podman/pod_pause.go
@@ -13,7 +13,7 @@ var (
podPauseCommand cliconfig.PodPauseValues
podPauseDescription = `Pauses one or more pods. The pod name or ID can be used.`
_podPauseCommand = &cobra.Command{
- Use: "pause",
+ Use: "pause [flags] POD [POD...]",
Short: "Pause one or more pods",
Long: podPauseDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/pod_restart.go b/cmd/podman/pod_restart.go
index 741fce588..ba77e1409 100644
--- a/cmd/podman/pod_restart.go
+++ b/cmd/podman/pod_restart.go
@@ -14,7 +14,7 @@ var (
podRestartCommand cliconfig.PodRestartValues
podRestartDescription = `Restarts one or more pods. The pod ID or name can be used.`
_podRestartCommand = &cobra.Command{
- Use: "restart",
+ Use: "restart [flags] POD [POD...]",
Short: "Restart one or more pods",
Long: podRestartDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/pod_rm.go b/cmd/podman/pod_rm.go
index ba16d03c7..fa452b061 100644
--- a/cmd/podman/pod_rm.go
+++ b/cmd/podman/pod_rm.go
@@ -18,7 +18,7 @@ be used. A pod with containers will not be removed without --force.
If --force is specified, all containers will be stopped, then removed.
`)
_podRmCommand = &cobra.Command{
- Use: "rm",
+ Use: "rm [flags] POD [POD...]",
Short: "Remove one or more pods",
Long: podRmDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/pod_start.go b/cmd/podman/pod_start.go
index 5761afd52..eef9d2a71 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",
+ Use: "start POD [POD...]",
Short: "Start one or more pods",
Long: podStartDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/pod_stats.go b/cmd/podman/pod_stats.go
index 907d6a547..f5edd21f8 100644
--- a/cmd/podman/pod_stats.go
+++ b/cmd/podman/pod_stats.go
@@ -24,7 +24,7 @@ var (
podStatsCommand cliconfig.PodStatsValues
podStatsDescription = "Display a live stream of resource usage statistics for the containers in or more pods"
_podStatsCommand = &cobra.Command{
- Use: "stats",
+ Use: "stats [flags] POD [POD...]",
Short: "Display percentage of CPU, memory, network I/O, block I/O and PIDs for containers in one or more pods",
Long: podStatsDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/pod_stop.go b/cmd/podman/pod_stop.go
index 62d0d4aa5..951cf082a 100644
--- a/cmd/podman/pod_stop.go
+++ b/cmd/podman/pod_stop.go
@@ -19,7 +19,7 @@ var (
`
_podStopCommand = &cobra.Command{
- Use: "stop",
+ Use: "stop [flags] POD [POD...]",
Short: "Stop one or more pods",
Long: podStopDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/pod_top.go b/cmd/podman/pod_top.go
index 790118496..6a26e3dff 100644
--- a/cmd/podman/pod_top.go
+++ b/cmd/podman/pod_top.go
@@ -25,7 +25,7 @@ the latest pod.
`, getDescriptorString())
_podTopCommand = &cobra.Command{
- Use: "top",
+ Use: "top [flags] CONTAINER [FORMAT-DESCRIPTORS]",
Short: "Display the running processes of containers in a pod",
Long: podTopDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/pod_unpause.go b/cmd/podman/pod_unpause.go
index 16481d0e2..6b142d573 100644
--- a/cmd/podman/pod_unpause.go
+++ b/cmd/podman/pod_unpause.go
@@ -14,7 +14,7 @@ var (
podUnpauseCommand cliconfig.PodUnpauseValues
podUnpauseDescription = `Unpauses one or more pods. The pod name or ID can be used.`
_podUnpauseCommand = &cobra.Command{
- Use: "unpause",
+ Use: "unpause [flags] POD [POD...]",
Short: "Unpause one or more pods",
Long: podUnpauseDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/port.go b/cmd/podman/port.go
index bcf372a51..ffb5749fb 100644
--- a/cmd/podman/port.go
+++ b/cmd/podman/port.go
@@ -20,7 +20,7 @@ var (
List port mappings for the CONTAINER, or lookup the public-facing port that is NAT-ed to the PRIVATE_PORT
`
_portCommand = &cobra.Command{
- Use: "port",
+ Use: "port [flags] CONTAINER",
Short: "List port mappings or a specific mapping for the container",
Long: portDescription,
RunE: func(cmd *cobra.Command, args []string) error {
@@ -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 9c165b836..fe4173fdd 100644
--- a/cmd/podman/ps.go
+++ b/cmd/podman/ps.go
@@ -157,11 +157,10 @@ func (a psSortedSize) Less(i, j int) bool {
var (
psCommand cliconfig.PsValues
psDescription = "Prints out information about the containers"
- _psCommand = &cobra.Command{
- Use: "list",
- Aliases: []string{"ls", "ps"},
- Short: "List containers",
- Long: psDescription,
+ _psCommand = cobra.Command{
+ Use: "ps",
+ Short: "List containers",
+ Long: psDescription,
RunE: func(cmd *cobra.Command, args []string) error {
psCommand.InputArgs = args
psCommand.GlobalFlags = MainGlobalOpts
@@ -174,7 +173,7 @@ var (
)
func init() {
- psCommand.Command = _psCommand
+ 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")
diff --git a/cmd/podman/pull.go b/cmd/podman/pull.go
index 71f555162..5f4658fe1 100644
--- a/cmd/podman/pull.go
+++ b/cmd/podman/pull.go
@@ -29,7 +29,7 @@ An image can be pulled using its tag or digest. If a tag is not
specified, the image with the 'latest' tag (if it exists) is pulled
`
_pullCommand = &cobra.Command{
- Use: "pull",
+ Use: "pull [flags] IMAGE-PATH",
Short: "Pull an image from a registry",
Long: pullDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/push.go b/cmd/podman/push.go
index 56261a8d3..bc909cb5e 100644
--- a/cmd/podman/push.go
+++ b/cmd/podman/push.go
@@ -26,7 +26,7 @@ var (
See podman-push(1) section "DESTINATION" for the expected format`)
_pushCommand = &cobra.Command{
- Use: "push",
+ Use: "push [flags] IMAGE REGISTRY",
Short: "Push an image to a specified destination",
Long: pushDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/restart.go b/cmd/podman/restart.go
index 58fb38874..5aa12070e 100644
--- a/cmd/podman/restart.go
+++ b/cmd/podman/restart.go
@@ -18,7 +18,7 @@ var (
restartCommand cliconfig.RestartValues
restartDescription = `Restarts one or more running containers. The container ID or name can be used. A timeout before forcibly stopping can be set, but defaults to 10 seconds`
_restartCommand = &cobra.Command{
- Use: "restart",
+ Use: "restart [flags] CONTAINER [CONTAINER...]",
Short: "Restart one or more containers",
Long: restartDescription,
RunE: func(cmd *cobra.Command, args []string) error {
@@ -73,7 +73,7 @@ func restartCmd(c *cliconfig.RestartValues) error {
defer runtime.Shutdown(false)
timeout := c.Timeout
- useTimeout := c.Flag("timeout").Changed
+ useTimeout := c.Flag("timeout").Changed || c.Flag("time").Changed
// Handle --latest
if c.Latest {
diff --git a/cmd/podman/restore.go b/cmd/podman/restore.go
index 5f6e7b892..73d355734 100644
--- a/cmd/podman/restore.go
+++ b/cmd/podman/restore.go
@@ -21,7 +21,7 @@ var (
Restores a container from a checkpoint. The container name or ID can be used.
`
_restoreCommand = &cobra.Command{
- Use: "restore",
+ Use: "restore [flags] CONTAINER [CONTAINER...]",
Short: "Restores one or more containers from a checkpoint",
Long: restoreDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/rm.go b/cmd/podman/rm.go
index 2dcb491d7..61b049840 100644
--- a/cmd/podman/rm.go
+++ b/cmd/podman/rm.go
@@ -21,7 +21,7 @@ The container name or ID can be used. This does not remove images.
Running containers will not be removed without the -f option.
`)
_rmCommand = &cobra.Command{
- Use: "rm",
+ Use: "rm [flags] CONTAINER [CONTAINER...]",
Short: "Remove one or more containers",
Long: rmDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/rmi.go b/cmd/podman/rmi.go
index 709ed14e0..5b8bf1ea3 100644
--- a/cmd/podman/rmi.go
+++ b/cmd/podman/rmi.go
@@ -5,8 +5,6 @@ import (
"os"
"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"
@@ -16,8 +14,8 @@ import (
var (
rmiCommand cliconfig.RmiValues
rmiDescription = "Removes one or more locally stored images."
- _rmiCommand = &cobra.Command{
- Use: "rmi",
+ _rmiCommand = cobra.Command{
+ Use: "rmi [flags] IMAGE [IMAGE...]",
Short: "Removes one or more images from local storage",
Long: rmiDescription,
RunE: func(cmd *cobra.Command, args []string) error {
@@ -31,19 +29,8 @@ var (
}
)
-func imageNotFound(err error) bool {
- if errors.Cause(err) == image.ErrNoSuchImage {
- return true
- }
- switch err.(type) {
- case *iopodman.ImageNotFound:
- return true
- }
- return false
-}
-
func init() {
- rmiCommand.Command = _rmiCommand
+ rmiCommand.Command = &_rmiCommand
rmiCommand.SetUsageTemplate(UsageTemplate())
flags := rmiCommand.Flags()
flags.BoolVarP(&rmiCommand.All, "all", "a", false, "Remove all images")
@@ -80,7 +67,7 @@ func rmiCmd(c *cliconfig.RmiValues) error {
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) {
+ if !adapter.IsImageNotFound(err) {
failureCnt++
}
if lastError != nil {
@@ -135,7 +122,7 @@ func rmiCmd(c *cliconfig.RmiValues) error {
newImage, err := runtime.NewImageFromLocal(i)
if err != nil {
if lastError != nil {
- if !imageNotFound(lastError) {
+ if !adapter.IsImageNotFound(lastError) {
failureCnt++
}
fmt.Fprintln(os.Stderr, lastError)
@@ -147,7 +134,7 @@ func rmiCmd(c *cliconfig.RmiValues) error {
}
}
- if imageNotFound(lastError) && failureCnt == 0 {
+ if adapter.IsImageNotFound(lastError) && failureCnt == 0 {
exitCode = 1
}
diff --git a/cmd/podman/run.go b/cmd/podman/run.go
index bea9b1743..f66b939d3 100644
--- a/cmd/podman/run.go
+++ b/cmd/podman/run.go
@@ -23,7 +23,7 @@ var (
runDescription = "Runs a command in a new container from the given image"
_runCommand = &cobra.Command{
- Use: "run",
+ Use: "run [flags] IMAGE [COMMAND [ARG...]]",
Short: "Run a command in a new container",
Long: runDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/runlabel.go b/cmd/podman/runlabel.go
index d466651f3..bc4e650f9 100644
--- a/cmd/podman/runlabel.go
+++ b/cmd/podman/runlabel.go
@@ -22,7 +22,7 @@ var (
Executes a command as described by a container image label.
`
_runlabelCommand = &cobra.Command{
- Use: "runlabel",
+ Use: "runlabel [flags] LABEL IMAGE [ARG...]",
Short: "Execute the command described by an image label",
Long: runlabelDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/save.go b/cmd/podman/save.go
index 161540deb..3bc283772 100644
--- a/cmd/podman/save.go
+++ b/cmd/podman/save.go
@@ -28,7 +28,7 @@ var (
Default is docker-archive`
_saveCommand = &cobra.Command{
- Use: "save",
+ Use: "save [flags] IMAGE",
Short: "Save image to an archive",
Long: saveDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/search.go b/cmd/podman/search.go
index f63131c84..5c14f1ff1 100644
--- a/cmd/podman/search.go
+++ b/cmd/podman/search.go
@@ -22,7 +22,7 @@ var (
Search registries for a given image. Can search all the default registries or a specific registry.
Can limit the number of results, and filter the output based on certain conditions.`
_searchCommand = &cobra.Command{
- Use: "search",
+ Use: "search [flags] TERM",
Short: "Search registry for image",
Long: searchDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/sign.go b/cmd/podman/sign.go
index 6e8f9ee95..2cf228d01 100644
--- a/cmd/podman/sign.go
+++ b/cmd/podman/sign.go
@@ -24,7 +24,7 @@ var (
signCommand cliconfig.SignValues
signDescription = "Create a signature file that can be used later to verify the image"
_signCommand = &cobra.Command{
- Use: "sign",
+ Use: "sign [flags] IMAGE [IMAGE...]",
Short: "Sign an image",
Long: signDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/start.go b/cmd/podman/start.go
index c645a35c4..3ce04ea79 100644
--- a/cmd/podman/start.go
+++ b/cmd/podman/start.go
@@ -21,7 +21,7 @@ var (
Starts one or more containers. The container name or ID can be used.
`
_startCommand = &cobra.Command{
- Use: "start",
+ Use: "start [flags] CONTAINER [CONTAINER...]",
Short: "Start one or more containers",
Long: startDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/stats.go b/cmd/podman/stats.go
index 2bbcd0a17..dcb274471 100644
--- a/cmd/podman/stats.go
+++ b/cmd/podman/stats.go
@@ -33,7 +33,7 @@ var (
statsDescription = "display a live stream of one or more containers' resource usage statistics"
_statsCommand = &cobra.Command{
- Use: "stats",
+ Use: "stats [flags] CONTAINER [CONTAINER...]",
Short: "Display percentage of CPU, memory, network I/O, block I/O and PIDs for one or more containers",
Long: statsDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/stop.go b/cmd/podman/stop.go
index 67c15b2a8..ab9a2cf38 100644
--- a/cmd/podman/stop.go
+++ b/cmd/podman/stop.go
@@ -24,7 +24,7 @@ var (
seconds otherwise.
`
_stopCommand = &cobra.Command{
- Use: "stop",
+ Use: "stop [flags] CONTAINER [CONTAINER...]",
Short: "Stop one or more containers",
Long: stopDescription,
RunE: func(cmd *cobra.Command, args []string) error {
@@ -73,21 +73,29 @@ func stopCmd(c *cliconfig.StopValues) error {
fmt.Println(err.Error())
}
+ if c.Flag("timeout").Changed && c.Flag("time").Changed {
+ return errors.New("the --timeout and --time flags are mutually exclusive")
+ }
+
var stopFuncs []shared.ParallelWorkerInput
for _, ctr := range containers {
con := ctr
var stopTimeout uint
- if c.Flag("timeout").Changed {
+ 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 && errors.Cause(err) != libpod.ErrCtrStopped {
+ 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(),
diff --git a/cmd/podman/tag.go b/cmd/podman/tag.go
index 2b9d67066..98c6e3449 100644
--- a/cmd/podman/tag.go
+++ b/cmd/podman/tag.go
@@ -12,7 +12,7 @@ var (
tagDescription = "Adds one or more additional names to locally-stored image"
_tagCommand = &cobra.Command{
- Use: "tag",
+ Use: "tag [flags] IMAGE TAG [TAG...]",
Short: "Add an additional name to a local image",
Long: tagDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/top.go b/cmd/podman/top.go
index 36d6bb6b4..cdf270fa7 100644
--- a/cmd/podman/top.go
+++ b/cmd/podman/top.go
@@ -34,7 +34,7 @@ the latest container.
`, getDescriptorString())
_topCommand = &cobra.Command{
- Use: "top",
+ Use: "top [flags] CONTAINER [FORMAT-DESCRIPTIOS]",
Short: "Display the running processes of a container",
Long: topDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/trust_set_show.go b/cmd/podman/trust_set_show.go
index 0a4783d0a..746854249 100644
--- a/cmd/podman/trust_set_show.go
+++ b/cmd/podman/trust_set_show.go
@@ -23,7 +23,7 @@ var (
showTrustCommand cliconfig.ShowTrustValues
setTrustDescription = "Set default trust policy or add a new trust policy for a registry"
_setTrustCommand = &cobra.Command{
- Use: "set",
+ Use: "set [flags] REGISTRY",
Short: "Set default trust policy or a new trust policy for a registry",
Long: setTrustDescription,
Example: "",
@@ -36,7 +36,7 @@ var (
showTrustDescription = "Display trust policy for the system"
_showTrustCommand = &cobra.Command{
- Use: "show",
+ Use: "show [flags] [REGISTRY]",
Short: "Display trust policy for the system",
Long: showTrustDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/umount.go b/cmd/podman/umount.go
index 6d9009388..48c97fa31 100644
--- a/cmd/podman/umount.go
+++ b/cmd/podman/umount.go
@@ -22,7 +22,7 @@ counter reaches zero indicating no other processes are using the mount.
An unmount can be forced with the --force flag.
`
_umountCommand = &cobra.Command{
- Use: "umount",
+ Use: "umount [flags] CONTAINER [CONTAINER...]",
Aliases: []string{"unmount"},
Short: "Unmounts working container's root filesystem",
Long: description,
diff --git a/cmd/podman/unpause.go b/cmd/podman/unpause.go
index efd9a20a3..58fd19fe1 100644
--- a/cmd/podman/unpause.go
+++ b/cmd/podman/unpause.go
@@ -21,7 +21,7 @@ var (
Unpauses one or more running containers. The container name or ID can be used.
`
_unpauseCommand = &cobra.Command{
- Use: "unpause",
+ Use: "unpause [flags] CONTAINER [CONTAINER...]",
Short: "Unpause the processes in one or more containers",
Long: unpauseDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/varlink.go b/cmd/podman/varlink.go
index d9c6cdb47..f19d03885 100644
--- a/cmd/podman/varlink.go
+++ b/cmd/podman/varlink.go
@@ -24,7 +24,7 @@ var (
run varlink interface
`
_varlinkCommand = &cobra.Command{
- Use: "varlink",
+ Use: "varlink [flags] URI",
Short: "Run varlink interface",
Long: varlinkDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/volume_create.go b/cmd/podman/volume_create.go
index 833191082..96b2ed8c7 100644
--- a/cmd/podman/volume_create.go
+++ b/cmd/podman/volume_create.go
@@ -18,7 +18,7 @@ Creates a new volume. If using the default driver, "local", the volume will
be created at.`
_volumeCreateCommand = &cobra.Command{
- Use: "create",
+ Use: "create [flags] [NAME]",
Short: "Create a new volume",
Long: volumeCreateDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/volume_inspect.go b/cmd/podman/volume_inspect.go
index dc6afbc36..8add7a375 100644
--- a/cmd/podman/volume_inspect.go
+++ b/cmd/podman/volume_inspect.go
@@ -16,7 +16,7 @@ Display detailed information on one or more volumes. Can change the format
from JSON to a Go template.
`
_volumeInspectCommand = &cobra.Command{
- Use: "inspect",
+ Use: "inspect [flags] VOLUME [VOLUME...]",
Short: "Display detailed information on one or more volumes",
Long: volumeInspectDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/cmd/podman/volume_rm.go b/cmd/podman/volume_rm.go
index 03b6ccae1..73b1a6668 100644
--- a/cmd/podman/volume_rm.go
+++ b/cmd/podman/volume_rm.go
@@ -19,7 +19,7 @@ not being used by any containers. To remove the volumes anyways, use the
--force flag.
`
_volumeRmCommand = &cobra.Command{
- Use: "rm",
+ Use: "rm [flags] VOLUME [VOLUME...]",
Aliases: []string{"remove"},
Short: "Remove one or more volumes",
Long: volumeRmDescription,
diff --git a/cmd/podman/wait.go b/cmd/podman/wait.go
index 9df7cdbae..9df2e3208 100644
--- a/cmd/podman/wait.go
+++ b/cmd/podman/wait.go
@@ -20,7 +20,7 @@ var (
Block until one or more containers stop and then print their exit codes
`
_waitCommand = &cobra.Command{
- Use: "wait",
+ Use: "wait [flags] CONTAINER [CONTAINER...]",
Short: "Block on one or more containers",
Long: waitDescription,
RunE: func(cmd *cobra.Command, args []string) error {
diff --git a/contrib/gate/Dockerfile b/contrib/gate/Dockerfile
index f9b57a6da..4d88ae9a6 100644
--- a/contrib/gate/Dockerfile
+++ b/contrib/gate/Dockerfile
@@ -49,8 +49,6 @@ WORKDIR $GOSRC
# Install dependencies
RUN set -x && \
- go get -u github.com/mailru/easyjson/... && \
- install -D -m 755 "$GOPATH"/bin/easyjson /usr/bin/ && \
make install.tools && \
install -D -m 755 $GOSRC/contrib/gate/entrypoint.sh /usr/local/bin/ && \
rm -rf "$GOSRC"
diff --git a/docs/podman-container.1.md b/docs/podman-container.1.md
index 31ea88570..86ffd32c4 100644
--- a/docs/podman-container.1.md
+++ b/docs/podman-container.1.md
@@ -11,40 +11,41 @@ The container command allows you to manage containers
## COMMANDS
-| Command | Man Page | Description |
-| ------- | --------------------------------------------------- | ---------------------------------------------------------------------------- |
-| attach | [podman-attach(1)](podman-attach.1.md) | Attach to a running container. |
+| Command | Man Page | Description |
+| --------- | --------------------------------------------------- | ---------------------------------------------------------------------------- |
+| attach | [podman-attach(1)](podman-attach.1.md) | Attach to a running container. |
| checkpoint | [podman-container-checkpoint(1)](podman-container-checkpoint.1.md) | Checkpoints one or more containers. |
-| cleanup | [podman-container-cleanup(1)](podman-container-cleanup.1.md) | Cleanup containers network and mountpoints. |
-| commit | [podman-commit(1)](podman-commit.1.md) | Create new image based on the changed container. |
-| create | [podman-create(1)](podman-create.1.md) | Create a new container. |
-| diff | [podman-diff(1)](podman-diff.1.md) | Inspect changes on a container or image's filesystem. |
-| exec | [podman-exec(1)](podman-exec.1.md) | Execute a command in a running container. |
-| exists | [podman-exists(1)](podman-container-exists.1.md) | Check if a container exists in local storage |
-| export | [podman-export(1)](podman-export.1.md) | Export a container's filesystem contents as a tar archive. |
-| inspect | [podman-inspect(1)](podman-inspect.1.md) | Display a container or image's configuration. |
-| kill | [podman-kill(1)](podman-kill.1.md) | Kill the main process in one or more containers. |
-| list | [podman-ps(1)](podman-ps.1.md) | List the containers on the system. |
-| logs | [podman-logs(1)](podman-logs.1.md) | Display the logs of a container. |
-| ls | [podman-ps(1)](podman-ps.1.md) | List the containers on the system. |
-| mount | [podman-mount(1)](podman-mount.1.md) | Mount a working container's root filesystem. |
-| pause | [podman-pause(1)](podman-pause.1.md) | Pause one or more containers. |
-| port | [podman-port(1)](podman-port.1.md) | List port mappings for the container. |
-| prune | [podman-container-prune(1)](podman-container-prune.1.md) | Remove all stopped containers from local storage |
-| ps | [podman-ps(1)](podman-ps.1.md) | List the containers on the system. |
-| refresh | [podman-refresh(1)](podman-container-refresh.1.md) | Refresh the state of all containers |
-| restart | [podman-restart(1)](podman-restart.1.md) | Restart one or more containers. |
-| restore | [podman-container-restore(1)](podman-container-restore.1.md) | Restores one or more containers from a checkpoint. |
-| rm | [podman-rm(1)](podman-rm.1.md) | Remove one or more containers. |
-| run | [podman-run(1)](podman-run.1.md) | Run a command in a container. |
-| start | [podman-start(1)](podman-start.1.md) | Starts one or more containers. |
-| stats | [podman-stats(1)](podman-stats.1.md) | Display a live stream of one or more container's resource usage statistics. |
-| stop | [podman-stop(1)](podman-stop.1.md) | Stop one or more running containers. |
-| top | [podman-top(1)](podman-top.1.md) | Display the running processes of a container. |
-| umount | [podman-umount(1)](podman-umount.1.md) | Unmount a working container's root filesystem. |
-| unmount | [podman-umount(1)](podman-umount.1.md) | Unmount a working container's root filesystem. |
-| unpause | [podman-unpause(1)](podman-unpause.1.md) | Unpause one or more containers. |
-| wait | [podman-wait(1)](podman-wait.1.md) | Wait on one or more containers to stop and print their exit codes. |
+| cleanup | [podman-container-cleanup(1)](podman-container-cleanup.1.md) | Cleanup containers network and mountpoints. |
+| commit | [podman-commit(1)](podman-commit.1.md) | Create new image based on the changed container. |
+| create | [podman-create(1)](podman-create.1.md) | Create a new container. |
+| diff | [podman-diff(1)](podman-diff.1.md) | Inspect changes on a container or image's filesystem. |
+| exec | [podman-exec(1)](podman-exec.1.md) | Execute a command in a running container. |
+| exists | [podman-exists(1)](podman-container-exists.1.md) | Check if a container exists in local storage |
+| export | [podman-export(1)](podman-export.1.md) | Export a container's filesystem contents as a tar archive. |
+| inspect | [podman-inspect(1)](podman-inspect.1.md) | Display a container or image's configuration. |
+| kill | [podman-kill(1)](podman-kill.1.md) | Kill the main process in one or more containers. |
+| list | [podman-ps(1)](podman-ps.1.md) | List the containers on the system. |
+| logs | [podman-logs(1)](podman-logs.1.md) | Display the logs of a container. |
+| ls | [podman-ps(1)](podman-ps.1.md) | List the containers on the system. |
+| mount | [podman-mount(1)](podman-mount.1.md) | Mount a working container's root filesystem. |
+| pause | [podman-pause(1)](podman-pause.1.md) | Pause one or more containers. |
+| port | [podman-port(1)](podman-port.1.md) | List port mappings for the container. |
+| prune | [podman-container-prune(1)](podman-container-prune.1.md)| Remove all stopped containers from local storage. |
+| ps | [podman-ps(1)](podman-ps.1.md) | List the containers on the system. |
+| refresh | [podman-refresh(1)](podman-container-refresh.1.md) | Refresh the state of all containers |
+| restart | [podman-restart(1)](podman-restart.1.md) | Restart one or more containers. |
+| restore | [podman-container-restore(1)](podman-container-restore.1.md) | Restores one or more containers from a checkpoint. |
+| rm | [podman-rm(1)](podman-rm.1.md) | Remove one or more containers. |
+| run | [podman-run(1)](podman-run.1.md) | Run a command in a container. |
+| runlabel | [podman-container-runlabel(1)](podman-container-runlabel.1.md) | Executes a command as described by a container image label. |
+| start | [podman-start(1)](podman-start.1.md) | Starts one or more containers. |
+| stats | [podman-stats(1)](podman-stats.1.md) | Display a live stream of one or more container's resource usage statistics. |
+| stop | [podman-stop(1)](podman-stop.1.md) | Stop one or more running containers. |
+| top | [podman-top(1)](podman-top.1.md) | Display the running processes of a container. |
+| umount | [podman-umount(1)](podman-umount.1.md) | Unmount a working container's root filesystem. |
+| unmount | [podman-umount(1)](podman-umount.1.md) | Unmount a working container's root filesystem. |
+| unpause | [podman-unpause(1)](podman-unpause.1.md) | Unpause one or more containers. |
+| wait | [podman-wait(1)](podman-wait.1.md) | Wait on one or more containers to stop and print their exit codes. |
## SEE ALSO
podman, podman-exec, podman-run
diff --git a/docs/podman-generate.1.md b/docs/podman-generate.1.md
index f19f48511..66afacd0b 100644
--- a/docs/podman-generate.1.md
+++ b/docs/podman-generate.1.md
@@ -13,7 +13,7 @@ The generate command will create structured output (like YAML) based on a contai
| Command | Man Page | Description |
| ------- | --------------------------------------------------- | ---------------------------------------------------------------------------- |
-| kube | [podman-generate-kube(1)](podman-generate-kube.1.md) | Generate Kubernetes YAML based on a pod or container
+| kube | [podman-generate-kube(1)](podman-generate-kube.1.md)| Generate Kubernetes YAML based on a pod or container. |
## SEE ALSO
podman, podman-pod, podman-container
diff --git a/docs/podman-image.1.md b/docs/podman-image.1.md
index 5a0c4e5f9..95e8b7e48 100644
--- a/docs/podman-image.1.md
+++ b/docs/podman-image.1.md
@@ -11,24 +11,24 @@ The image command allows you to manage images
## COMMANDS
-| Command | Man Page | Description |
-| -------- | ----------------------------------------- | ------------------------------------------------------------------------------ |
-| build | [podman-build(1)](podman-build.1.md) | Build a container using a Dockerfile. |
-| exists | [podman-exists(1)](podman-image-exists.1.md) | Check if a image exists in local storage |
-| history | [podman-history(1)](podman-history.1.md) | Show the history of an image. |
-| import | [podman-import(1)](podman-import.1.md) | Import a tarball and save it as a filesystem image. |
-| inspect | [podman-inspect(1)](podman-inspect.1.md) | Display a image or image's configuration. |
-| list | [podman-images(1)](podman-images.1.md) | List the container images on the system. |
-| load | [podman-load(1)](podman-load.1.md) | Load an image from the docker archive. |
-| ls | [podman-images(1)](podman-images.1.md) | List the container images on the system. |
-| pull | [podman-pull(1)](podman-pull.1.md) | Pull an image from a registry. |
-| prune| [podman-container-prune(1)](podman-container-prune.1.md) | Removed all unused images from the local store |
-| push | [podman-push(1)](podman-push.1.md) | Push an image from local storage to elsewhere. |
-| rm | [podman-rm(1)](podman-rmi.1.md) | Removes one or more locally stored images. |
-| save | [podman-save(1)](podman-save.1.md) | Save an image to docker-archive or oci. |
-| tag | [podman-tag(1)](podman-tag.1.md) | Add an additional name to a local image. |
-| trust | [podman-image-trust(1)](podman-image-trust.1.md) | Manage container image trust policy. |
-| sign | [podman-image-sign(1)](podman-image-sign.1.md) | Sign an image. |
+| Command | Man Page | Description |
+| -------- | ----------------------------------------------- | --------------------------------------------------------------------------- |
+| build | [podman-build(1)](podman-build.1.md) | Build a container using a Dockerfile. |
+| exists | [podman-exists(1)](podman-image-exists.1.md) | Check if a image exists in local storage. |
+| history | [podman-history(1)](podman-history.1.md) | Show the history of an image. |
+| import | [podman-import(1)](podman-import.1.md) | Import a tarball and save it as a filesystem image. |
+| inspect | [podman-inspect(1)](podman-inspect.1.md) | Display a image or image's configuration. |
+| list | [podman-images(1)](podman-images.1.md) | List the container images on the system. |
+| load | [podman-load(1)](podman-load.1.md) | Load an image from the docker archive. |
+| ls | [podman-images(1)](podman-images.1.md) | List the container images on the system. |
+| prune | [podman-image-prune(1)](podman-image-prune.1.md)| Removed all unused images from the local store. |
+| pull | [podman-pull(1)](podman-pull.1.md) | Pull an image from a registry. |
+| push | [podman-push(1)](podman-push.1.md) | Push an image from local storage to elsewhere. |
+| rm | [podman-rm(1)](podman-rmi.1.md) | Removes one or more locally stored images. |
+| save | [podman-save(1)](podman-save.1.md) | Save an image to docker-archive or oci. |
+| sign | [podman-image-sign(1)](podman-image-sign.1.md) | Sign an image. |
+| tag | [podman-tag(1)](podman-tag.1.md) | Add an additional name to a local image. |
+| trust | [podman-image-trust(1)](podman-image-trust.1.md)| Manage container image trust policy. |
## SEE ALSO
podman
diff --git a/docs/podman-import.1.md b/docs/podman-import.1.md
index c80c4ff77..03055018a 100644
--- a/docs/podman-import.1.md
+++ b/docs/podman-import.1.md
@@ -4,13 +4,14 @@
podman\-import - Import a tarball and save it as a filesystem image
## SYNOPSIS
-**podman import** [*options*] *path*
+**podman import** [*options*] *path* [*reference*]
## DESCRIPTION
**podman import** imports a tarball (.tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz)
and saves it as a filesystem image. Remote tarballs can be specified using a URL.
Various image instructions can be configured with the **--change** flag and
a commit message can be set using the **--message** flag.
+**reference**, if present, is a tag to assign to the image.
Note: `:` is a restricted character and cannot be part of the file name.
## OPTIONS
diff --git a/docs/podman-play.1.md b/docs/podman-play.1.md
index c703c1455..6d2a7beba 100644
--- a/docs/podman-play.1.md
+++ b/docs/podman-play.1.md
@@ -14,7 +14,7 @@ file input. Containers will be automatically started.
| Command | Man Page | Description |
| ------- | --------------------------------------------------- | ---------------------------------------------------------------------------- |
-| kube | [podman-play-kube(1)](podman-play-kube.1.md) | Recreate pods and containers based on Kubernetes YAML.
+| kube | [podman-play-kube(1)](podman-play-kube.1.md) | Recreate pods and containers based on Kubernetes YAML. |
## SEE ALSO
podman, podman-pod(1), podman-container(1), podman-generate(1), podman-play(1), podman-play-kube(1)
diff --git a/docs/podman-pod-stats.1.md b/docs/podman-pod-stats.1.md
new file mode 100644
index 000000000..be32f05be
--- /dev/null
+++ b/docs/podman-pod-stats.1.md
@@ -0,0 +1,92 @@
+% podman-pod-stats "1"
+
+## NAME
+podman\-pod\-stats - Display a live stream of resource usage statistics for the containers in one or more pods
+
+## SYNOPSIS
+**podman pod stats** [*options*] [*pod*]
+
+## DESCRIPTION
+Display a live stream of containers in one or more pods resource usage statistics
+
+## OPTIONS
+
+**--all, -a**
+
+Show all containers. Only running containers are shown by default
+
+**--latest, -l**
+
+Instead of providing the pod name or ID, use the last created pod.
+
+The latest option is not supported on the remote client.
+
+**--no-reset**
+
+Do not clear the terminal/screen in between reporting intervals
+
+**--no-stream**
+
+Disable streaming pod stats and only pull the first result, default setting is false
+
+**--format="TEMPLATE"**
+
+Pretty-print container statistics to JSON or using a Go template
+
+Valid placeholders for the Go template are listed below:
+
+| **Placeholder** | **Description** |
+| --------------- | --------------- |
+| .Pod | Pod ID |
+| .CID | Container ID |
+| .Name | Container Name |
+| .CPU | CPU percentage |
+| .MemUsage | Memory usage |
+| .Mem | Memory percentage |
+| .NetIO | Network IO |
+| .BlockIO | Block IO |
+| .PIDS | Number of PIDs |
+
+When using a GO template, you may preceed the format with `table` to print headers.
+## EXAMPLE
+
+```
+# podman pod stats -a --no-stream
+ID NAME CPU % MEM USAGE / LIMIT MEM % NET IO BLOCK IO PIDS
+a9f807ffaacd frosty_hodgkin -- 3.092MB / 16.7GB 0.02% -- / -- -- / -- 2
+3b33001239ee sleepy_stallman -- -- / -- -- -- / -- -- / -- --
+```
+
+```
+# podman pod stats --no-stream a9f80
+ID NAME CPU % MEM USAGE / LIMIT MEM % NET IO BLOCK IO PIDS
+a9f807ffaacd frosty_hodgkin -- 3.092MB / 16.7GB 0.02% -- / -- -- / -- 2
+```
+
+```
+# podman pod stats --no-stream --format=json a9f80
+[
+ {
+ "id": "a9f807ffaacd",
+ "name": "frosty_hodgkin",
+ "cpu_percent": "--",
+ "mem_usage": "3.092MB / 16.7GB",
+ "mem_percent": "0.02%",
+ "netio": "-- / --",
+ "blocki": "-- / --",
+ "pids": "2"
+ }
+]
+```
+
+```
+# podman pod-stats --no-stream --format "table {{.ID}} {{.Name}} {{.MemUsage}}" 6eae
+ID NAME MEM USAGE / LIMIT
+6eae9e25a564 clever_bassi 3.031MB / 16.7GB
+```
+
+## SEE ALSO
+podman-pod(1), podman(1)
+
+## HISTORY
+February 2019, Originally compiled by Dan Walsh <dwalsh@redhat.com>
diff --git a/docs/podman-pod.1.md b/docs/podman-pod.1.md
index 621348c03..8f8403a40 100644
--- a/docs/podman-pod.1.md
+++ b/docs/podman-pod.1.md
@@ -11,16 +11,24 @@ podman pod is a set of subcommands that manage pods, or groups of containers.
## SUBCOMMANDS
-| Subcommand | Description |
-| ------------------------------------------------- | ------------------------------------------------------------------------------ |
-| [podman-pod-create(1)](podman-pod-create.1.md) | Create a new pod. |
-| [podman-pod-kill(1)](podman-pod-kill.1.md) | Kill the main process of each container in pod. |
-| [podman-pod-pause(1)](podman-pod-pause.1.md) | Pause one or more pods. |
-| [podman-pod-ps(1)](podman-pod-ps.1.md) | Prints out information about pods. |
-| [podman-pod-rm(1)](podman-pod-rm.1.md) | Remove one or more pods. |
-| [podman-pod-start(1)](podman-pod-start.1.md) | Start one or more pods. |
-| [podman-pod-stop(1)](podman-pod-stop.1.md) | Stop one or more pods. |
-| [podman-pod-unpause(1)](podman-pod-unpause.1.md) | Unpause one or more pods. |
+| Command | Man Page | Description |
+| ------- | ------------------------------------------------- | ------------------------------------------------------------------------------ |
+| create | [podman-pod-create(1)](podman-pod-create.1.md) | Create a new pod. |
+| exists | [podman-pod-exists(1)](podman-pod-exists.1.md) | Check if a pod exists in local storage. |
+| inspect | [podman-pod-inspect(1)](podman-pod-inspect.1.md) | Displays information describing a pod. |
+| kill | [podman-pod-kill(1)](podman-pod-kill.1.md) | Kill the main process of each container in pod. |
+| pause | [podman-pod-pause(1)](podman-pod-pause.1.md) | Pause one or more pods. |
+| ps | [podman-pod-ps(1)](podman-pod-ps.1.md) | Prints out information about pods. |
+| restart | [podman-pod-restart(1)](podman-pod-restart.1.md) | Restart one or mode pods. |
+| rm | [podman-pod-rm(1)](podman-pod-rm.1.md) | Remove one or more pods. |
+| start | [podman-pod-start(1)](podman-pod-start.1.md) | Start one or more pods. |
+| stats | [podman-pod-stats(1)](podman-pod-stats.1.md) | Display live stream resource usage stats for containers in one or more pods. |
+| stop | [podman-pod-stop(1)](podman-pod-stop.1.md) | Stop one or more pods. |
+| top | [podman-pod-top(1)](podman-pod-top.1.md) | Display the running processes of containers in a pod. |
+| unpause | [podman-pod-unpause(1)](podman-pod-unpause.1.md) | Unpause one or more pods. |
+
+## SEE ALSO
+podman(1)
## HISTORY
July 2018, Originally compiled by Peter Hunt <pehunt@redhat.com>
diff --git a/docs/podman-system.1.md b/docs/podman-system.1.md
index 1b4bccdb9..d088d4d9a 100644
--- a/docs/podman-system.1.md
+++ b/docs/podman-system.1.md
@@ -15,6 +15,7 @@ The system command allows you to manage the podman systems
| ------- | --------------------------------------------------- | ---------------------------------------------------------------------------- |
| 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 |
+| renumber | [podman-system-renumber(1)](podman-system-renumber.1.md)| Migrate lock numbers to handle a change in maximum number of locks. |
## SEE ALSO
-podman
+podman(1)
diff --git a/docs/podman-volume.1.md b/docs/podman-volume.1.md
index ac32abbd6..77728b2b5 100644
--- a/docs/podman-volume.1.md
+++ b/docs/podman-volume.1.md
@@ -11,13 +11,16 @@ podman volume is a set of subcommands that manage volumes.
## SUBCOMMANDS
-| Subcommand | Description |
-| ------------------------------------------------- | ------------------------------------------------------------------------------ |
-| [podman-volume-create(1)](podman-volume-create.1.md) | Create a new volume. |
-| [podman-volume-inspect(1)](podman-volume-inspect.1.md) | Get detailed information on one or more volumes. |
-| [podman-volume-ls(1)](podman-volume-ls.1.md) | List all the available volumes. |
-| [podman-volume-rm(1)](podman-volume-rm.1.md) | Remove one or more volumes. |
-| [podman-volume-prune(1)](podman-volume-prune.1.md) | Remove all unused volumes. |
+| Command | Man Page | Description |
+| ------- | ------------------------------------------------------ | ------------------------------------------------------------------------------ |
+| create | [podman-volume-create(1)](podman-volume-create.1.md) | Create a new volume. |
+| inspect | [podman-volume-inspect(1)](podman-volume-inspect.1.md) | Get detailed information on one or more volumes. |
+| ls | [podman-volume-ls(1)](podman-volume-ls.1.md) | List all the available volumes. |
+| prune | [podman-volume-prune(1)](podman-volume-prune.1.md) | Remove all unused volumes. |
+| rm | [podman-volume-rm(1)](podman-volume-rm.1.md) | Remove one or more volumes. |
+
+## SEE ALSO
+podman(1)
## HISTORY
November 2018, Originally compiled by Urvashi Mohnani <umohnani@redhat.com>
diff --git a/docs/podman.1.md b/docs/podman.1.md
index 760f27310..43f288fd7 100644
--- a/docs/podman.1.md
+++ b/docs/podman.1.md
@@ -72,7 +72,7 @@ Default state dir is configured in /etc/containers/storage.conf.
Name of the OCI runtime as specified in libpod.conf or absolute path to the OCI compatible binary used to run containers.
-**--storage-driver, -s**=**value**
+**--storage-driver**=**value**
Storage driver. The default storage driver for UID 0 is configured in /etc/containers/storage.conf (`$HOME/.config/containers/storage.conf` in rootless mode), and is *vfs* for non-root users when *fuse-overlayfs* is not available. The `STORAGE_DRIVER` environment variable overrides the default. The --storage-driver specified driver overrides all.
@@ -136,6 +136,8 @@ the exit codes follow the `chroot` standard, see below:
| [podman-diff(1)](podman-diff.1.md) | Inspect changes on a container or image's filesystem. |
| [podman-exec(1)](podman-exec.1.md) | Execute a command in a running container. |
| [podman-export(1)](podman-export.1.md) | Export a container's filesystem contents as a tar archive. |
+| [podman-generate(1)](podman-generate.1.md)| Generate structured data based for a containers and pods. |
+| [podman-help(1)](podman-history.1.md) | Show help information on podman. |
| [podman-history(1)](podman-history.1.md) | Show the history of an image. |
| [podman-image(1)](podman-image.1.md) | Manage Images. |
| [podman-images(1)](podman-images.1.md) | List images in local storage. |
@@ -149,10 +151,13 @@ the exit codes follow the `chroot` standard, see below:
| [podman-logs(1)](podman-logs.1.md) | Display the logs of a container. |
| [podman-mount(1)](podman-mount.1.md) | Mount a working container's root filesystem. |
| [podman-pause(1)](podman-pause.1.md) | Pause one or more containers. |
+| [podman-play(1)](podman-play.1.md) | Play pods and containers based on a structured input file. |
+| [podman-pod(1)](podman-pod.1.md) | Management tool for groups of containers, called pods. |
| [podman-port(1)](podman-port.1.md) | List port mappings for the container. |
| [podman-ps(1)](podman-ps.1.md) | Prints out information about containers. |
| [podman-pull(1)](podman-pull.1.md) | Pull an image from a registry. |
| [podman-push(1)](podman-push.1.md) | Push an image from local storage to elsewhere. |
+| [podman-refresh(1)](podman-refresh.1.md) | Refresh state of all containers to handle database changes. |
| [podman-restart(1)](podman-restart.1.md) | Restart one or more containers. |
| [podman-rm(1)](podman-rm.1.md) | Remove one or more containers. |
| [podman-rmi(1)](podman-rmi.1.md) | Removes one or more locally stored images. |
@@ -167,8 +172,9 @@ the exit codes follow the `chroot` standard, see below:
| [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. |
| [podman-unpause(1)](podman-unpause.1.md) | Unpause one or more containers. |
-| [podman-version(1)](podman-version.1.md) | Display the Podman version information. |
-| [podman-volume(1)](podman-volume.1.md) | Manage Volumes. |
+| [podman-varlink(1)](podman-varlink.1.md) | Display the Podman version information. |
+| [podman-version(1)](podman-version.1.md) | Runs the varlink backend interface. |
+| [podman-volume(1)](podman-volume.1.md) | Manage Volumes. |
| [podman-wait(1)](podman-wait.1.md) | Wait on one or more containers to stop and print their exit codes. |
## FILES
diff --git a/hack/podman-commands.sh b/hack/podman-commands.sh
new file mode 100755
index 000000000..e4c63ab59
--- /dev/null
+++ b/hack/podman-commands.sh
@@ -0,0 +1,40 @@
+#!/bin/sh
+./bin/podman --help | sed -n -Ee '0,/Available Commands/d' -e '/^Flags/q;p' | sed '/^$/d' | awk '{ print $1 }' > /tmp/podman.cmd
+man ./docs/podman.1 | sed -n -e '0,/COMMANDS/d' -e '/^FILES/q;p' | grep podman | cut -f2 -d- | cut -f1 -d\( > /tmp/podman.man
+echo diff -B -u /tmp/podman.cmd /tmp/podman.man
+diff -B -u /tmp/podman.cmd /tmp/podman.man
+
+./bin/podman image --help | sed -n -e '0,/Available Commands/d' -e '/^Flags/q;p' | sed '/^$/d' | awk '{ print $1 }' > /tmp/podman-image.cmd
+man ./docs/podman-image.1 | sed -n -Ee '0,/COMMANDS/d' -e 's/^[[:space:]]*//' -e '/^SEE ALSO/q;p' | grep podman | cut -f1 -d' ' | sed 's/^.//' > /tmp/podman-image.man
+echo diff -B -u /tmp/podman-image.cmd /tmp/podman-image.man
+diff -B -u /tmp/podman-image.cmd /tmp/podman-image.man
+
+./bin/podman container --help | sed -n -e '0,/Available Commands/d' -e '/^Flags/q;p' | sed '/^$/d' | awk '{ print $1 }' > /tmp/podman-container.cmd
+man docs/podman-container.1 | sed -n -Ee '0,/COMMANDS/d' -e 's/^[[:space:]]*//' -e '/^SEE ALSO/q;p' | grep podman | cut -f1 -d' ' | sed 's/^.//' > /tmp/podman-container.man
+echo diff -B -u /tmp/podman-container.cmd /tmp/podman-container.man
+diff -B -u /tmp/podman-container.cmd /tmp/podman-container.man
+
+./bin/podman system --help | sed -n -e '0,/Available Commands/d' -e '/^Flags/q;p' | sed '/^$/d' | awk '{ print $1 }' > /tmp/podman-system.cmd
+man docs/podman-system.1 | sed -n -Ee '0,/COMMANDS/d' -e 's/^[[:space:]]*//' -e '/^SEE ALSO/q;p' | grep podman | cut -f1 -d' ' | sed 's/^.//' > /tmp/podman-system.man
+echo diff -B -u /tmp/podman-system.cmd /tmp/podman-system.man
+diff -B -u /tmp/podman-system.cmd /tmp/podman-system.man
+
+./bin/podman play --help | sed -n -e '0,/Available Commands/d' -e '/^Flags/q;p' | sed '/^$/d' | awk '{ print $1 }' > /tmp/podman-play.cmd
+man docs/podman-play.1 | sed -n -Ee '0,/COMMANDS/d' -e 's/^[[:space:]]*//' -e '/^SEE ALSO/q;p' | grep podman | cut -f1 -d' ' | sed 's/^.//' > /tmp/podman-play.man
+echo diff -B -u /tmp/podman-play.cmd /tmp/podman-play.man
+diff -B -u /tmp/podman-play.cmd /tmp/podman-play.man
+
+./bin/podman generate --help | sed -n -e '0,/Available Commands/d' -e '/^Flags/q;p' | sed '/^$/d' | awk '{ print $1 }' > /tmp/podman-generate.cmd
+man docs/podman-generate.1 | sed -n -Ee '0,/COMMANDS/d' -e 's/^[[:space:]]*//' -e '/^SEE ALSO/q;p' | grep podman | cut -f1 -d' ' | sed 's/^.//' > /tmp/podman-generate.man
+echo diff -B -u /tmp/podman-generate.cmd /tmp/podman-generate.man
+diff -B -u /tmp/podman-generate.cmd /tmp/podman-generate.man
+
+./bin/podman pod --help | sed -n -e '0,/Available Commands/d' -e '/^Flags/q;p' | sed '/^$/d' | awk '{ print $1 }' > /tmp/podman-pod.cmd
+man docs/podman-pod.1 | sed -n -Ee '0,/COMMANDS/d' -e 's/^[[:space:]]*//' -e '/^SEE ALSO/q;p' | grep podman | cut -f1 -d' ' | sed 's/^.//' > /tmp/podman-pod.man
+echo diff -B -u /tmp/podman-pod.cmd /tmp/podman-pod.man
+diff -B -u /tmp/podman-pod.cmd /tmp/podman-pod.man
+
+./bin/podman volume --help | sed -n -e '0,/Available Commands/d' -e '/^Flags/q;p' | sed '/^$/d' | awk '{ print $1 }' > /tmp/podman-volume.cmd
+man docs/podman-volume.1 | sed -n -Ee '0,/COMMANDS/d' -e 's/^[[:space:]]*//' -e '/^SEE ALSO/q;p' | grep podman | cut -f1 -d' ' | sed 's/^.//' > /tmp/podman-volume.man
+echo diff -B -u /tmp/podman-volume.cmd /tmp/podman-volume.man
+diff -B -u /tmp/podman-volume.cmd /tmp/podman-volume.man
diff --git a/libpod/container_api.go b/libpod/container_api.go
index 09d7f220d..6bef3c47d 100644
--- a/libpod/container_api.go
+++ b/libpod/container_api.go
@@ -203,9 +203,8 @@ func (c *Container) Kill(signal uint) error {
}
// Exec starts a new process inside the container
-// TODO allow specifying streams to attach to
// TODO investigate allowing exec without attaching
-func (c *Container) Exec(tty, privileged bool, env, cmd []string, user, workDir string) error {
+func (c *Container) Exec(tty, privileged bool, env, cmd []string, user, workDir string, streams *AttachStreams) error {
var capList []string
locked := false
@@ -267,7 +266,7 @@ func (c *Container) Exec(tty, privileged bool, env, cmd []string, user, workDir
logrus.Debugf("Creating new exec session in container %s with session id %s", c.ID(), sessionID)
- execCmd, err := c.runtime.ociRuntime.execContainer(c, cmd, capList, env, tty, workDir, hostUser, sessionID)
+ execCmd, err := c.runtime.ociRuntime.execContainer(c, cmd, capList, env, tty, workDir, hostUser, sessionID, streams)
if err != nil {
return errors.Wrapf(err, "error exec %s", c.ID())
}
diff --git a/libpod/oci.go b/libpod/oci.go
index 26d2c6ef1..4bf76f619 100644
--- a/libpod/oci.go
+++ b/libpod/oci.go
@@ -733,7 +733,7 @@ func (r *OCIRuntime) unpauseContainer(ctr *Container) error {
// TODO: Add --detach support
// TODO: Convert to use conmon
// TODO: add --pid-file and use that to generate exec session tracking
-func (r *OCIRuntime) execContainer(c *Container, cmd, capAdd, env []string, tty bool, cwd, user, sessionID string) (*exec.Cmd, error) {
+func (r *OCIRuntime) execContainer(c *Container, cmd, capAdd, env []string, tty bool, cwd, user, sessionID string, streams *AttachStreams) (*exec.Cmd, error) {
if len(cmd) == 0 {
return nil, errors.Wrapf(ErrInvalidArg, "must provide a command to execute")
}
@@ -789,9 +789,17 @@ func (r *OCIRuntime) execContainer(c *Container, cmd, capAdd, env []string, tty
logrus.Debugf("Starting runtime %s with following arguments: %v", r.path, args)
execCmd := exec.Command(r.path, args...)
- execCmd.Stdout = os.Stdout
- execCmd.Stderr = os.Stderr
- execCmd.Stdin = os.Stdin
+
+ if streams.AttachOutput {
+ execCmd.Stdout = streams.OutputStream
+ }
+ if streams.AttachInput {
+ execCmd.Stdin = streams.InputStream
+ }
+ if streams.AttachError {
+ execCmd.Stderr = streams.ErrorStream
+ }
+
execCmd.Env = append(execCmd.Env, fmt.Sprintf("XDG_RUNTIME_DIR=%s", runtimeDir))
if err := execCmd.Start(); err != nil {
diff --git a/libpod/runtime.go b/libpod/runtime.go
index 827c22f5b..f53cdd8b8 100644
--- a/libpod/runtime.go
+++ b/libpod/runtime.go
@@ -331,16 +331,13 @@ func NewRuntime(options ...RuntimeOption) (runtime *Runtime, err error) {
deepcopier.Copy(defaultRuntimeConfig).To(runtime.config)
runtime.config.TmpDir = tmpDir
- if rootless.IsRootless() {
- // If we're rootless, override the default storage config
- storageConf, volumePath, err := util.GetDefaultStoreOptions()
- if err != nil {
- return nil, errors.Wrapf(err, "error retrieving rootless storage config")
- }
- runtime.config.StorageConfig = storageConf
- runtime.config.StaticDir = filepath.Join(storageConf.GraphRoot, "libpod")
- runtime.config.VolumePath = volumePath
+ storageConf, err := util.GetDefaultStoreOptions()
+ if err != nil {
+ return nil, errors.Wrapf(err, "error retrieving rootless storage config")
}
+ runtime.config.StorageConfig = storageConf
+ runtime.config.StaticDir = filepath.Join(storageConf.GraphRoot, "libpod")
+ runtime.config.VolumePath = filepath.Join(storageConf.GraphRoot, "volumes")
configPath := ConfigPath
foundConfig := true
diff --git a/pkg/adapter/runtime.go b/pkg/adapter/runtime.go
index 4f5b98dbb..8624981b1 100644
--- a/pkg/adapter/runtime.go
+++ b/pkg/adapter/runtime.go
@@ -333,3 +333,11 @@ func (r *LocalRuntime) LoadImage(ctx context.Context, name string, cli *cliconfi
}
return r.Runtime.LoadImage(ctx, name, cli.Input, writer, cli.SignaturePolicy)
}
+
+// IsImageNotFound checks if the error indicates that no image was found.
+func IsImageNotFound(err error) bool {
+ if errors.Cause(err) == image.ErrNoSuchImage {
+ return true
+ }
+ return false
+}
diff --git a/pkg/adapter/runtime_remote.go b/pkg/adapter/runtime_remote.go
index ca2fad852..29b43e9b0 100644
--- a/pkg/adapter/runtime_remote.go
+++ b/pkg/adapter/runtime_remote.go
@@ -796,3 +796,15 @@ func (r *LocalRuntime) LoadImage(ctx context.Context, name string, cli *cliconfi
}
return names, nil
}
+
+// IsImageNotFound checks if the error indicates that no image was found.
+func IsImageNotFound(err error) bool {
+ if errors.Cause(err) == image.ErrNoSuchImage {
+ return true
+ }
+ switch err.(type) {
+ case *iopodman.ImageNotFound:
+ return true
+ }
+ return false
+}
diff --git a/pkg/rootless/rootless_linux.go b/pkg/rootless/rootless_linux.go
index 9a192c0fa..98692707f 100644
--- a/pkg/rootless/rootless_linux.go
+++ b/pkg/rootless/rootless_linux.go
@@ -93,7 +93,8 @@ func tryMappingTool(tool string, pid int, hostID int, mappings []idtools.IDMap)
Args: args,
}
- if err := cmd.Run(); err != nil {
+ if output, err := cmd.CombinedOutput(); err != nil {
+ logrus.Debugf("error from %s: %s", tool, output)
return errors.Wrapf(err, "cannot setup namespace using %s", tool)
}
return nil
diff --git a/pkg/secrets/secrets.go b/pkg/secrets/secrets.go
index 242953609..3b64f8952 100644
--- a/pkg/secrets/secrets.go
+++ b/pkg/secrets/secrets.go
@@ -8,6 +8,7 @@ import (
"strings"
"github.com/containers/libpod/pkg/rootless"
+ "github.com/containers/storage/pkg/idtools"
rspec "github.com/opencontainers/runtime-spec/specs-go"
"github.com/opencontainers/selinux/go-selinux/label"
"github.com/pkg/errors"
@@ -176,7 +177,7 @@ func SecretMountsWithUIDGID(mountLabel, containerWorkingDir, mountFile, mountPre
// Add FIPS mode secret if /etc/system-fips exists on the host
_, err := os.Stat("/etc/system-fips")
if err == nil {
- if err := addFIPSModeSecret(&secretMounts, containerWorkingDir); err != nil {
+ if err := addFIPSModeSecret(&secretMounts, containerWorkingDir, mountPrefix, mountLabel, uid, gid); err != nil {
logrus.Errorf("error adding FIPS mode secret to container: %v", err)
}
} else if os.IsNotExist(err) {
@@ -264,13 +265,16 @@ func addSecretsFromMountsFile(filePath, mountLabel, containerWorkingDir, mountPr
// root filesystem if /etc/system-fips exists on hosts.
// This enables the container to be FIPS compliant and run openssl in
// FIPS mode as the host is also in FIPS mode.
-func addFIPSModeSecret(mounts *[]rspec.Mount, containerWorkingDir string) error {
+func addFIPSModeSecret(mounts *[]rspec.Mount, containerWorkingDir, mountPrefix, mountLabel string, uid, gid int) error {
secretsDir := "/run/secrets"
ctrDirOnHost := filepath.Join(containerWorkingDir, secretsDir)
if _, err := os.Stat(ctrDirOnHost); os.IsNotExist(err) {
- if err = os.MkdirAll(ctrDirOnHost, 0755); err != nil {
+ if err = idtools.MkdirAllAs(ctrDirOnHost, 0755, uid, gid); err != nil {
return errors.Wrapf(err, "making container directory on host failed")
}
+ if err = label.Relabel(ctrDirOnHost, mountLabel, false); err != nil {
+ return errors.Wrap(err, "error applying correct labels")
+ }
}
fipsFile := filepath.Join(ctrDirOnHost, "system-fips")
// In the event of restart, it is possible for the FIPS mode file to already exist
@@ -284,7 +288,7 @@ func addFIPSModeSecret(mounts *[]rspec.Mount, containerWorkingDir string) error
if !mountExists(*mounts, secretsDir) {
m := rspec.Mount{
- Source: ctrDirOnHost,
+ Source: filepath.Join(mountPrefix, secretsDir),
Destination: secretsDir,
Type: "bind",
Options: []string{"bind", "rprivate"},
diff --git a/pkg/util/utils.go b/pkg/util/utils.go
index db8a3d5bb..a4576191b 100644
--- a/pkg/util/utils.go
+++ b/pkg/util/utils.go
@@ -259,15 +259,6 @@ func GetRootlessStorageOpts() (storage.StoreOptions, error) {
return opts, nil
}
-// GetRootlessVolumePath returns where all the name volumes will be created in rootless mode
-func GetRootlessVolumePath() (string, error) {
- dataDir, _, err := GetRootlessDirInfo()
- if err != nil {
- return "", err
- }
- return filepath.Join(dataDir, "containers", "storage", "volumes"), nil
-}
-
type tomlOptionsConfig struct {
MountProgram string `toml:"mount_program"`
}
@@ -297,25 +288,18 @@ func getTomlStorage(storeOptions *storage.StoreOptions) *tomlConfig {
return config
}
-// GetDefaultStoreOptions returns the storage ops for containers and the volume path
-// for the volume API
-// It also returns the path where all named volumes will be created using the volume API
-func GetDefaultStoreOptions() (storage.StoreOptions, string, error) {
+// GetDefaultStoreOptions returns the default storage ops for containers
+func GetDefaultStoreOptions() (storage.StoreOptions, error) {
var (
defaultRootlessRunRoot string
defaultRootlessGraphRoot string
err error
)
storageOpts := storage.DefaultStoreOptions
- volumePath := filepath.Join(storageOpts.GraphRoot, "volumes")
if rootless.IsRootless() {
storageOpts, err = GetRootlessStorageOpts()
if err != nil {
- return storageOpts, volumePath, err
- }
- volumePath, err = GetRootlessVolumePath()
- if err != nil {
- return storageOpts, volumePath, err
+ return storageOpts, err
}
}
@@ -332,7 +316,7 @@ func GetDefaultStoreOptions() (storage.StoreOptions, string, error) {
os.MkdirAll(filepath.Dir(storageConf), 0755)
file, err := os.OpenFile(storageConf, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0666)
if err != nil {
- return storageOpts, volumePath, errors.Wrapf(err, "cannot open %s", storageConf)
+ return storageOpts, errors.Wrapf(err, "cannot open %s", storageConf)
}
tomlConfiguration := getTomlStorage(&storageOpts)
@@ -353,7 +337,7 @@ func GetDefaultStoreOptions() (storage.StoreOptions, string, error) {
}
}
}
- return storageOpts, volumePath, nil
+ return storageOpts, nil
}
// StorageConfigFile returns the path to the storage config file used
diff --git a/remote_client.md b/remote_client.md
new file mode 100644
index 000000000..be5c918c8
--- /dev/null
+++ b/remote_client.md
@@ -0,0 +1,77 @@
+# Podman remote-client tutorial
+
+## What is the remote-client
+
+First and foremost, the remote-client is under heavy development. We are adding new
+commands and functions frequently. We also are working on a rootless implementation that
+does not require privileged users.
+
+The purpose of the Podman remote-client is to allow users to interact with a Podman "backend"
+while on a separate client. The command line interface of the remote client is exactly the
+same as the regular Podman commands with the exception of some flags being removed as they
+do not apply to the remote-client.
+
+## What you need
+To use the remote-client, you will need a binary for your client and a Podman "backend"; hereafter
+referred to as the Podman node. In this context, a Podman node is a Linux system with Podman
+installed on it and the varlink service activated. You will also need to be able to ssh into this
+system as a user with privileges to the varlink socket (more on this later).
+
+## Building the remote client
+At this time, the remote-client is not being packaged for any distribution. It must be built from
+source. To set up your build environment, see [Installation notes](install.md) and follow the
+section [Building from scratch](install.md#building-from-scratch). Once you can successfully
+build the regular Podman binary, you can now build the remote-client.
+```
+$ make podman-remote
+```
+Like building the regular Podman, the resulting binary will be in the *bin* directory. This is the binary
+you will run on the remote node later in the instructions.
+
+## Setting up the remote and Podman nodes
+
+To use the remote-client, you must perform some setup on both the remote and Podman nodes. In this case,
+the remote node refers to where the remote-client is being run; and the Podman node refers to where
+Podman and its storage reside.
+
+### Podman node setup
+The Podman node must have Podman (not the remote-client) installed as normal. If your system uses systemd,
+then simply start the Podman varlink socket.
+```
+$ sudo systemctl start io.podman.socket
+```
+
+If your system cannot use systemd, then you can manually establish the varlink socket with the Podman
+command:
+```
+$ sudo podman --log-level debug varlink --timeout 0 unix://run/podman/io.podman
+```
+
+### Required permissions
+For now, the remote-client requires that you be able to run a privileged Podman and have privileged ssh
+access to the remote system. This limitation is being worked on.
+
+### Remote node setup
+
+#### Initiate an ssh session to the Podman node
+To use the remote client, we must establish an ssh connection to the Podman server. We will also use
+that session to bind the remote varlink socket locally.
+
+```
+$ ssh -L 127.0.0.1:1234:/run/podman/io.podman root@remotehost
+```
+Note here we are binding the Podman socket to a local TCP socket on port 1234.
+
+#### Running the remote client
+With the ssh session established, we can now run the remote client in a different terminal window. You
+must inform Podman where to look for the bound socket you created in the previous step using an
+environment variable.
+
+```
+$ PODMAN_VARLINK_ADDRESS="tcp:127.0.0.1:1234" bin/podman-remote images
+REPOSITORY TAG IMAGE ID CREATED SIZE
+docker.io/library/ubuntu latest 47b19964fb50 2 weeks ago 90.7 MB
+docker.io/library/alpine latest caf27325b298 3 weeks ago 5.8 MB
+quay.io/cevich/gcloud_centos latest 641dad61989a 5 weeks ago 489 MB
+k8s.gcr.io/pause 3.1 da86e6ba6ca1 14 months ago 747 kB
+```
diff --git a/test/test_podman_baseline.sh b/test/test_podman_baseline.sh
index 8a878b4e7..664fd2b03 100755
--- a/test/test_podman_baseline.sh
+++ b/test/test_podman_baseline.sh
@@ -195,7 +195,7 @@ podman rmi --all
########
# 1.004608 MB is 1,004,608 bytes. The container overhead is 4608 bytes (or 9 512 byte pages), so this allocates 1 MB of usable storage
-PODMANBASE="-s overlay --storage-opt overlay.size=1.004608M --root /tmp/podman_test/crio"
+PODMANBASE="--storage-driver overlay --storage-opt overlay.size=1.004608M --root /tmp/podman_test/crio"
TMPDIR=/tmp/podman_test
mkdir $TMPDIR
dd if=/dev/zero of=$TMPDIR/virtfs bs=1024 count=30720