aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel J Walsh <dwalsh@redhat.com>2018-03-26 16:23:24 -0400
committerAtomic Bot <atomic-devel@projectatomic.io>2018-03-26 23:27:00 +0000
commita3156da21ccd830639ff5699c13da82f3062439b (patch)
tree998cb5ec5553dd2c96703e164a47afc97e7417e9
parentb18f089545b27aaa09b565651851822d18ef0dc3 (diff)
downloadpodman-a3156da21ccd830639ff5699c13da82f3062439b.tar.gz
podman-a3156da21ccd830639ff5699c13da82f3062439b.tar.bz2
podman-a3156da21ccd830639ff5699c13da82f3062439b.zip
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 <dwalsh@redhat.com> Closes: #552 Approved by: mheon
-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")
+
+ })
+
})