From 1f8569f7d768c411b5fed4446817c79b4b5337a0 Mon Sep 17 00:00:00 2001
From: Daniel J Walsh <dwalsh@redhat.com>
Date: Wed, 1 Apr 2020 09:49:21 -0400
Subject: Fix environment handling from containers.conf

Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
---
 cmd/podman/shared/create.go                   | 27 ++++++++++++++++-----------
 go.sum                                        |  2 ++
 pkg/spec/spec.go                              | 12 +++++++++++-
 test/e2e/build/basicalpine/Containerfile.path |  2 ++
 test/e2e/build_test.go                        | 20 ++++++++++++++++++++
 5 files changed, 51 insertions(+), 12 deletions(-)
 create mode 100644 test/e2e/build/basicalpine/Containerfile.path

diff --git a/cmd/podman/shared/create.go b/cmd/podman/shared/create.go
index 5fa8d6c0b..68a36d967 100644
--- a/cmd/podman/shared/create.go
+++ b/cmd/podman/shared/create.go
@@ -538,14 +538,16 @@ func ParseCreateOpts(ctx context.Context, c *GenericCLIResults, runtime *libpod.
 		}
 	}
 
-	// env overrides any previous variables
-	cmdlineEnv := c.StringSlice("env")
-	if len(cmdlineEnv) > 0 {
-		parsedEnv, err := envLib.ParseSlice(cmdlineEnv)
-		if err != nil {
-			return nil, err
+	if c.IsSet("env") {
+		// env overrides any previous variables
+		cmdlineEnv := c.StringSlice("env")
+		if len(cmdlineEnv) > 0 {
+			parsedEnv, err := envLib.ParseSlice(cmdlineEnv)
+			if err != nil {
+				return nil, err
+			}
+			env = envLib.Join(env, parsedEnv)
 		}
-		env = envLib.Join(env, parsedEnv)
 	}
 
 	// LABEL VARIABLES
@@ -636,10 +638,13 @@ func ParseCreateOpts(ctx context.Context, c *GenericCLIResults, runtime *libpod.
 	if err != nil {
 		return nil, errors.Wrapf(err, "unable to translate --shm-size")
 	}
-	// Verify the additional hosts are in correct format
-	for _, host := range c.StringSlice("add-host") {
-		if _, err := parse.ValidateExtraHost(host); err != nil {
-			return nil, err
+
+	if c.IsSet("add-host") {
+		// Verify the additional hosts are in correct format
+		for _, host := range c.StringSlice("add-host") {
+			if _, err := parse.ValidateExtraHost(host); err != nil {
+				return nil, err
+			}
 		}
 	}
 
diff --git a/go.sum b/go.sum
index ac6a4fca1..fb7f216c6 100644
--- a/go.sum
+++ b/go.sum
@@ -189,6 +189,7 @@ github.com/google/btree v0.0.0-20160524151835-7d79101e329e/go.mod h1:lNA+9X1NB3Z
 github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
 github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=
 github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=
@@ -617,6 +618,7 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
 gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
 gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
diff --git a/pkg/spec/spec.go b/pkg/spec/spec.go
index d4fd5976f..4732af757 100644
--- a/pkg/spec/spec.go
+++ b/pkg/spec/spec.go
@@ -316,7 +316,17 @@ func (config *CreateConfig) createConfigToOCISpec(runtime *libpod.Runtime, userM
 
 	// Make sure to always set the default variables unless overridden in the
 	// config.
-	config.Env = env.Join(env.DefaultEnvVariables, config.Env)
+	var defaultEnv map[string]string
+	if runtimeConfig == nil {
+		defaultEnv = env.DefaultEnvVariables
+	} else {
+		defaultEnv, err = env.ParseSlice(runtimeConfig.Containers.Env)
+		if err != nil {
+			return nil, errors.Wrap(err, "Env fields in containers.conf failed ot parse")
+		}
+		defaultEnv = env.Join(env.DefaultEnvVariables, defaultEnv)
+	}
+	config.Env = env.Join(defaultEnv, config.Env)
 	for name, val := range config.Env {
 		g.AddProcessEnv(name, val)
 	}
diff --git a/test/e2e/build/basicalpine/Containerfile.path b/test/e2e/build/basicalpine/Containerfile.path
new file mode 100644
index 000000000..d2b03a6b8
--- /dev/null
+++ b/test/e2e/build/basicalpine/Containerfile.path
@@ -0,0 +1,2 @@
+FROM alpine
+ENV PATH=/tmp:/bin:/usr/bin:/usr/sbin
diff --git a/test/e2e/build_test.go b/test/e2e/build_test.go
index 8b03e9386..9e41fd231 100644
--- a/test/e2e/build_test.go
+++ b/test/e2e/build_test.go
@@ -175,4 +175,24 @@ var _ = Describe("Podman build", func() {
 		data := inspect.InspectImageJSON()
 		Expect(data[0].ID).To(Equal(string(id)))
 	})
+
+	It("podman Test PATH in built image", func() {
+		path := "/tmp:/bin:/usr/bin:/usr/sbin"
+		session := podmanTest.PodmanNoCache([]string{
+			"build", "-f", "build/basicalpine/Containerfile.path", "-t", "test-path",
+		})
+		session.WaitWithDefaultTimeout()
+		Expect(session.ExitCode()).To(Equal(0))
+
+		session = podmanTest.Podman([]string{"run", "test-path", "printenv", "PATH"})
+		session.WaitWithDefaultTimeout()
+		Expect(session.ExitCode()).To(Equal(0))
+		stdoutLines := session.OutputToStringArray()
+		Expect(stdoutLines[0]).Should(Equal(path))
+
+		session = podmanTest.PodmanNoCache([]string{"rmi", "-a", "-f"})
+		session.WaitWithDefaultTimeout()
+		Expect(session.ExitCode()).To(Equal(0))
+	})
+
 })
-- 
cgit v1.2.3-54-g00ecf