diff options
-rw-r--r-- | cmd/podman/exec.go | 32 | ||||
-rw-r--r-- | 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 81b69953b..02b65792e 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,23 +75,25 @@ 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]) - } - - 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)) + // 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]] = "" } } + 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 95068a774..c64c8666c 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") + + }) + }) |