summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd/podman/exec.go32
-rw-r--r--test/e2e/exec_test.go28
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")
+
+ })
+
})