summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd/podman/common/specgen.go29
-rw-r--r--pkg/specgen/generate/container.go40
-rw-r--r--pkg/specgen/specgen.go7
3 files changed, 50 insertions, 26 deletions
diff --git a/cmd/podman/common/specgen.go b/cmd/podman/common/specgen.go
index 4de622916..e7b88eb3f 100644
--- a/cmd/podman/common/specgen.go
+++ b/cmd/podman/common/specgen.go
@@ -307,10 +307,11 @@ func FillOutSpecGen(s *specgen.SpecGenerator, c *ContainerCLIOpts, args []string
// ENVIRONMENT VARIABLES
//
// Precedence order (higher index wins):
- // 1) env-host, 2) image data, 3) env-file, 4) env
- env := map[string]string{
- "container": "podman",
- }
+ // 1) containers.conf (EnvHost, EnvHTTP, Env) 2) image data, 3 User EnvHost/EnvHTTP, 4) env-file, 5) env
+ // containers.conf handled and image data handled on the server side
+ // user specified EnvHost and EnvHTTP handled on Server Side relative to Server
+ // env-file and env handled on client side
+ var env map[string]string
// First transform the os env into a map. We need it for the labels later in
// any case.
@@ -319,24 +320,8 @@ func FillOutSpecGen(s *specgen.SpecGenerator, c *ContainerCLIOpts, args []string
return errors.Wrap(err, "error parsing host environment variables")
}
- if c.EnvHost {
- env = envLib.Join(env, osEnv)
- } else if c.HTTPProxy {
- for _, envSpec := range []string{
- "http_proxy",
- "HTTP_PROXY",
- "https_proxy",
- "HTTPS_PROXY",
- "ftp_proxy",
- "FTP_PROXY",
- "no_proxy",
- "NO_PROXY",
- } {
- if v, ok := osEnv[envSpec]; ok {
- env[envSpec] = v
- }
- }
- }
+ s.EnvHost = c.EnvHost
+ s.HTTPProxy = c.HTTPProxy
// env-file overrides any previous variables
for _, f := range c.EnvFile {
diff --git a/pkg/specgen/generate/container.go b/pkg/specgen/generate/container.go
index 53d160442..147ebd61b 100644
--- a/pkg/specgen/generate/container.go
+++ b/pkg/specgen/generate/container.go
@@ -2,6 +2,7 @@ package generate
import (
"context"
+ "os"
"github.com/containers/image/v5/manifest"
"github.com/containers/podman/v2/libpod"
@@ -62,14 +63,24 @@ func CompleteSpec(ctx context.Context, r *libpod.Runtime, s *specgen.SpecGenerat
if err != nil {
return nil, err
}
- // Get Default Environment
- defaultEnvs, err := envLib.ParseSlice(rtc.Containers.Env)
+ // First transform the os env into a map. We need it for the labels later in
+ // any case.
+ osEnv, err := envLib.ParseSlice(os.Environ())
if err != nil {
- return nil, errors.Wrap(err, "Env fields in containers.conf failed to parse")
+ return nil, errors.Wrap(err, "error parsing host environment variables")
}
+ // Get Default Environment from containers.conf
+ defaultEnvs, err := envLib.ParseSlice(rtc.GetDefaultEnv())
+ if err != nil {
+ return nil, errors.Wrap(err, "error parsing fields in containers.conf")
+ }
+ if defaultEnvs["containers"] == "" {
+ defaultEnvs["containers"] = "podman"
+ }
var envs map[string]string
+ // Image Environment defaults
if newImage != nil {
// Image envs from the image if they don't exist
// already, overriding the default environments
@@ -82,9 +93,30 @@ func CompleteSpec(ctx context.Context, r *libpod.Runtime, s *specgen.SpecGenerat
if err != nil {
return nil, errors.Wrap(err, "Env fields from image failed to parse")
}
+ defaultEnvs = envLib.Join(defaultEnvs, envs)
+ }
+
+ // Caller Specified defaults
+ if s.EnvHost {
+ defaultEnvs = envLib.Join(defaultEnvs, osEnv)
+ } else if s.HTTPProxy {
+ for _, envSpec := range []string{
+ "http_proxy",
+ "HTTP_PROXY",
+ "https_proxy",
+ "HTTPS_PROXY",
+ "ftp_proxy",
+ "FTP_PROXY",
+ "no_proxy",
+ "NO_PROXY",
+ } {
+ if v, ok := osEnv[envSpec]; ok {
+ defaultEnvs[envSpec] = v
+ }
+ }
}
- s.Env = envLib.Join(envLib.Join(defaultEnvs, envs), s.Env)
+ s.Env = envLib.Join(defaultEnvs, s.Env)
// Labels and Annotations
annotations := make(map[string]string)
diff --git a/pkg/specgen/specgen.go b/pkg/specgen/specgen.go
index a52225f87..cca05eddb 100644
--- a/pkg/specgen/specgen.go
+++ b/pkg/specgen/specgen.go
@@ -43,6 +43,13 @@ type ContainerBasicConfig struct {
// image's configuration.
// Optional.
Command []string `json:"command,omitempty"`
+ // EnvHost indicates that the host environment should be added to container
+ // Optional.
+ EnvHost bool `json:"env_host,omitempty"`
+ // EnvHTTPProxy indicates that the http host proxy environment variables
+ // should be added to container
+ // Optional.
+ HTTPProxy bool `json:"httpproxy,omitempty"`
// Env is a set of environment variables that will be set in the
// container.
// Optional.