diff options
author | baude <bbaude@redhat.com> | 2018-10-08 13:46:09 -0500 |
---|---|---|
committer | baude <bbaude@redhat.com> | 2018-10-11 09:52:53 -0500 |
commit | 255b56ae4122e25a969bbd13d8105763746d2ca7 (patch) | |
tree | e275d10256d93f6893f961dfdcd6aef18fcd6a88 | |
parent | 23c9816ba9ff1af3538dcb725d86fc565df53a30 (diff) | |
download | podman-255b56ae4122e25a969bbd13d8105763746d2ca7.tar.gz podman-255b56ae4122e25a969bbd13d8105763746d2ca7.tar.bz2 podman-255b56ae4122e25a969bbd13d8105763746d2ca7.zip |
fix runlabel functions based on QA feedback
Signed-off-by: baude <bbaude@redhat.com>
-rw-r--r-- | cmd/podman/runlabel.go | 80 | ||||
-rw-r--r-- | cmd/podman/shared/funcs.go | 4 | ||||
-rw-r--r-- | docs/podman-container-runlabel.1.md | 21 |
3 files changed, 82 insertions, 23 deletions
diff --git a/cmd/podman/runlabel.go b/cmd/podman/runlabel.go index 34e6b9093..d514a79fc 100644 --- a/cmd/podman/runlabel.go +++ b/cmd/podman/runlabel.go @@ -6,9 +6,11 @@ import ( "os" "strings" + "github.com/containers/image/types" "github.com/containers/libpod/cmd/podman/libpodruntime" "github.com/containers/libpod/cmd/podman/shared" "github.com/containers/libpod/libpod/image" + "github.com/containers/libpod/pkg/util" "github.com/containers/libpod/utils" "github.com/pkg/errors" "github.com/sirupsen/logrus" @@ -23,7 +25,7 @@ var ( }, cli.BoolFlag{ Name: "display", - Usage: "preview the command that `podman install` would execute", + Usage: "preview the command that the label would run", }, cli.StringFlag{ Name: "cert-dir", @@ -74,13 +76,14 @@ var ( Executes a command as described by a container image label. ` runlabelCommand = cli.Command{ - Name: "runlabel", - Usage: "Execute the command described by an image label", - Description: runlabelDescription, - Flags: runlabelFlags, - Action: runlabelCmd, - ArgsUsage: "", - OnUsageError: usageErrorHandler, + Name: "runlabel", + Usage: "Execute the command described by an image label", + Description: runlabelDescription, + Flags: runlabelFlags, + Action: runlabelCmd, + ArgsUsage: "", + SkipArgReorder: true, + OnUsageError: usageErrorHandler, } ) @@ -110,12 +113,8 @@ func runlabelCmd(c *cli.Context) error { defer runtime.Shutdown(false) args := c.Args() - if len(args) == 0 { - logrus.Errorf("an image name must be specified") - return nil - } if len(args) < 2 { - logrus.Errorf("the runlabel command requires at least 2 arguments") + logrus.Errorf("the runlabel command requires at least 2 arguments: LABEL IMAGE") return nil } if err := validateFlags(c, runlabelFlags); err != nil { @@ -130,18 +129,17 @@ func runlabelCmd(c *cli.Context) error { runlabelImage := args[1] - if c.IsSet("opts1") { - opts["opts1"] = c.String("opts1") + if c.IsSet("opt1") { + opts["opt1"] = c.String("opt1") } - if c.IsSet("opts2") { - opts["opts2"] = c.String("opts2") + if c.IsSet("opt2") { + opts["opt2"] = c.String("opt2") } - if c.IsSet("opts3") { - opts["opts3"] = c.String("opts3") + if c.IsSet("opt3") { + opts["opt3"] = c.String("opt3") } ctx := getContext() - rtc := runtime.GetConfig() stdErr = os.Stderr stdOut = os.Stdout @@ -154,7 +152,21 @@ func runlabelCmd(c *cli.Context) error { } if pull { - newImage, err = runtime.ImageRuntime().New(ctx, runlabelImage, rtc.SignaturePolicyPath, "", stdOut, nil, image.SigningOptions{}, false, false) + var registryCreds *types.DockerAuthConfig + if c.IsSet("creds") { + creds, err := util.ParseRegistryCreds(c.String("creds")) + if err != nil { + return err + } + registryCreds = creds + } + dockerRegistryOptions := image.DockerRegistryOptions{ + DockerRegistryCreds: registryCreds, + DockerCertPath: c.String("cert-dir"), + DockerInsecureSkipTLSVerify: !c.BoolT("tls-verify"), + } + + newImage, err = runtime.ImageRuntime().New(ctx, runlabelImage, c.String("signature-policy"), c.String("authfile"), stdOut, &dockerRegistryOptions, image.SigningOptions{}, false, false) } else { newImage, err = runtime.ImageRuntime().NewFromLocal(runlabelImage) } @@ -187,6 +199,23 @@ func runlabelCmd(c *cli.Context) error { env := shared.GenerateRunEnvironment(c.String("name"), imageName, opts) env = append(env, "PODMAN_RUNLABEL_NESTED=1") + envmap := envSliceToMap(env) + + envmapper := func(k string) string { + switch k { + case "OPT1": + return envmap["OPT1"] + case "OPT2": + return envmap["OPT2"] + case "OPT3": + return envmap["OPT3"] + } + return "" + } + + newS := os.Expand(strings.Join(cmd, " "), envmapper) + cmd = strings.Split(newS, " ") + if !c.Bool("quiet") { fmt.Printf("Command: %s\n", strings.Join(cmd, " ")) if c.Bool("display") { @@ -195,3 +224,12 @@ func runlabelCmd(c *cli.Context) error { } return utils.ExecCmdWithStdStreams(stdIn, stdOut, stdErr, env, cmd[0], cmd[1:]...) } + +func envSliceToMap(env []string) map[string]string { + m := make(map[string]string) + for _, i := range env { + split := strings.Split(i, "=") + m[split[0]] = strings.Join(split[1:], " ") + } + return m +} diff --git a/cmd/podman/shared/funcs.go b/cmd/podman/shared/funcs.go index 21e7fe10d..485944f29 100644 --- a/cmd/podman/shared/funcs.go +++ b/cmd/podman/shared/funcs.go @@ -24,10 +24,14 @@ func GenerateCommand(command, imageName, name string) []string { newArg = imageName case "IMAGE=IMAGE": newArg = fmt.Sprintf("IMAGE=%s", imageName) + case "IMAGE=$IMAGE": + newArg = fmt.Sprintf("IMAGE=%s", imageName) case "NAME": newArg = name case "NAME=NAME": newArg = fmt.Sprintf("NAME=%s", name) + case "NAME=$NAME": + newArg = fmt.Sprintf("NAME=%s", name) default: newArg = arg } diff --git a/docs/podman-container-runlabel.1.md b/docs/podman-container-runlabel.1.md index 889a5fb03..4611aa4d9 100644 --- a/docs/podman-container-runlabel.1.md +++ b/docs/podman-container-runlabel.1.md @@ -28,8 +28,8 @@ If the container image has a LABEL INSTALL instruction like the following: Note: Podman will always ensure that `podman` is the first argument of the command being executed. -**NAME** -The name specified via the command. NAME will be replaced with IMAGE if it is not specified. +**LABEL** +The label name specified via the command. **IMAGE** Image name specified via the command. @@ -95,6 +95,23 @@ Require HTTPS and verify certificates when contacting registries (default: true) then tls verification will be used, If set to false then tls verification will not be used. If not specified tls verification will be used unless the target registry is listed as an insecure registry in registries.conf +## Examples ## + +Execute the run label of an image called foobar. +``` +$ sudo podman container runlabel run foobar +``` + +Execute the install label of an image called foobar with additional arguments. +``` +$ sudo podman container runlabel install foobar apples oranges +``` + +Display the command that would be executed by runlabel. +``` +$ sudo podman container runlabel --display run foobar +``` + ## SEE ALSO podman(1) |