From a3156da21ccd830639ff5699c13da82f3062439b Mon Sep 17 00:00:00 2001 From: Daniel J Walsh Date: Mon, 26 Mar 2018 16:23:24 -0400 Subject: [PATCH] podman exec should handle options --env foo If the user does not specify foo=bar, then the exec code should look for the foo environment variable in its environment and pass it in. This is the way podman run works. Also added tests to make sure this all works. Signed-off-by: Daniel J Walsh Closes: #552 Approved by: mheon --- cmd/podman/exec.go | 32 ++++++++++++++++---------------- test/e2e/exec_test.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 16 deletions(-) diff --git a/cmd/podman/exec.go b/cmd/podman/exec.go index 81b69953bf..02b65792ec 100644 --- a/cmd/podman/exec.go +++ b/cmd/podman/exec.go @@ -6,7 +6,6 @@ import ( "github.com/pkg/errors" "github.com/projectatomic/libpod/libpod" - "github.com/projectatomic/libpod/pkg/util" "github.com/urfave/cli" ) @@ -48,7 +47,6 @@ var ( ) func execCmd(c *cli.Context) error { - var envs []string args := c.Args() var ctr *libpod.Container var err error @@ -77,22 +75,24 @@ func execCmd(c *cli.Context) error { if err != nil { return errors.Wrapf(err, "unable to exec into %s", args[0]) } - // Create a list of keys provided by the user - var userEnvKeys []string - for _, env := range c.StringSlice("env") { - splitEnv := strings.Split(env, "=") - userEnvKeys = append(userEnvKeys, splitEnv[0]) + + // ENVIRONMENT VARIABLES + env := defaultEnvVariables + for _, e := range c.StringSlice("env") { + split := strings.SplitN(e, "=", 2) + if len(split) > 1 { + env[split[0]] = split[1] + } else { + env[split[0]] = "" + } } - envs = append(envs, c.StringSlice("env")...) - - // if the default key isnt in the user-provided list, add the default - // key and value to the environment variables. this is needed to set - // PATH for example. - for k, v := range defaultEnvVariables { - if !util.StringInSlice(k, userEnvKeys) { - envs = append(envs, fmt.Sprintf("%s=%s", k, v)) - } + if err := readKVStrings(env, []string{}, c.StringSlice("env")); err != nil { + return errors.Wrapf(err, "unable to process environment variables") + } + envs := []string{} + for k, v := range env { + envs = append(envs, fmt.Sprintf("%s=%s", k, v)) } return ctr.Exec(c.Bool("tty"), c.Bool("privileged"), envs, cmd, c.String("user")) diff --git a/test/e2e/exec_test.go b/test/e2e/exec_test.go index 95068a774e..c64c8666c7 100644 --- a/test/e2e/exec_test.go +++ b/test/e2e/exec_test.go @@ -59,4 +59,32 @@ var _ = Describe("Podman exec", func() { session.WaitWithDefaultTimeout() Expect(session.ExitCode()).To(Equal(0)) }) + + It("podman exec environment test", func() { + setup := podmanTest.RunTopContainer("test1") + setup.WaitWithDefaultTimeout() + Expect(setup.ExitCode()).To(Equal(0)) + + session := podmanTest.Podman([]string{"exec", "-l", "--env", "FOO=BAR", "printenv", "FOO"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + match, _ := session.GrepString("BAR") + Expect(match).Should(BeTrue()) + + session = podmanTest.Podman([]string{"exec", "-l", "--env", "PATH=/bin", "printenv", "PATH"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + match, _ = session.GrepString("/bin") + Expect(match).Should(BeTrue()) + + os.Setenv("FOO", "BAR") + session = podmanTest.Podman([]string{"exec", "-l", "--env", "FOO", "printenv", "FOO"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + match, _ = session.GrepString("BAR") + Expect(match).Should(BeTrue()) + os.Unsetenv("FOO") + + }) + })