mirror of
https://github.com/containers/podman.git
synced 2025-08-06 19:44:14 +08:00
Use environment from containers.conf
podman needs to use the environment settings in containers.conf when setting up the containers. Also host environment variables should be relative to server side not the client. Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
This commit is contained in:
@ -307,10 +307,11 @@ func FillOutSpecGen(s *specgen.SpecGenerator, c *ContainerCLIOpts, args []string
|
|||||||
// ENVIRONMENT VARIABLES
|
// ENVIRONMENT VARIABLES
|
||||||
//
|
//
|
||||||
// Precedence order (higher index wins):
|
// Precedence order (higher index wins):
|
||||||
// 1) env-host, 2) image data, 3) env-file, 4) env
|
// 1) containers.conf (EnvHost, EnvHTTP, Env) 2) image data, 3 User EnvHost/EnvHTTP, 4) env-file, 5) env
|
||||||
env := map[string]string{
|
// containers.conf handled and image data handled on the server side
|
||||||
"container": "podman",
|
// 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
|
// First transform the os env into a map. We need it for the labels later in
|
||||||
// any case.
|
// any case.
|
||||||
@ -319,24 +320,8 @@ func FillOutSpecGen(s *specgen.SpecGenerator, c *ContainerCLIOpts, args []string
|
|||||||
return errors.Wrap(err, "error parsing host environment variables")
|
return errors.Wrap(err, "error parsing host environment variables")
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.EnvHost {
|
s.EnvHost = c.EnvHost
|
||||||
env = envLib.Join(env, osEnv)
|
s.HTTPProxy = c.HTTPProxy
|
||||||
} 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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// env-file overrides any previous variables
|
// env-file overrides any previous variables
|
||||||
for _, f := range c.EnvFile {
|
for _, f := range c.EnvFile {
|
||||||
|
@ -2,6 +2,7 @@ package generate
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"os"
|
||||||
|
|
||||||
"github.com/containers/image/v5/manifest"
|
"github.com/containers/image/v5/manifest"
|
||||||
"github.com/containers/podman/v2/libpod"
|
"github.com/containers/podman/v2/libpod"
|
||||||
@ -62,14 +63,24 @@ func CompleteSpec(ctx context.Context, r *libpod.Runtime, s *specgen.SpecGenerat
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
// Get Default Environment
|
// First transform the os env into a map. We need it for the labels later in
|
||||||
defaultEnvs, err := envLib.ParseSlice(rtc.Containers.Env)
|
// any case.
|
||||||
|
osEnv, err := envLib.ParseSlice(os.Environ())
|
||||||
if err != nil {
|
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
|
var envs map[string]string
|
||||||
|
|
||||||
|
// Image Environment defaults
|
||||||
if newImage != nil {
|
if newImage != nil {
|
||||||
// Image envs from the image if they don't exist
|
// Image envs from the image if they don't exist
|
||||||
// already, overriding the default environments
|
// already, overriding the default environments
|
||||||
@ -82,9 +93,30 @@ func CompleteSpec(ctx context.Context, r *libpod.Runtime, s *specgen.SpecGenerat
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "Env fields from image failed to parse")
|
return nil, errors.Wrap(err, "Env fields from image failed to parse")
|
||||||
}
|
}
|
||||||
|
defaultEnvs = envLib.Join(defaultEnvs, envs)
|
||||||
}
|
}
|
||||||
|
|
||||||
s.Env = envLib.Join(envLib.Join(defaultEnvs, envs), s.Env)
|
// 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(defaultEnvs, s.Env)
|
||||||
|
|
||||||
// Labels and Annotations
|
// Labels and Annotations
|
||||||
annotations := make(map[string]string)
|
annotations := make(map[string]string)
|
||||||
|
@ -43,6 +43,13 @@ type ContainerBasicConfig struct {
|
|||||||
// image's configuration.
|
// image's configuration.
|
||||||
// Optional.
|
// Optional.
|
||||||
Command []string `json:"command,omitempty"`
|
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
|
// Env is a set of environment variables that will be set in the
|
||||||
// container.
|
// container.
|
||||||
// Optional.
|
// Optional.
|
||||||
|
Reference in New Issue
Block a user