From b02b933c6292c539833c15c15299628ac3360572 Mon Sep 17 00:00:00 2001 From: Michael Crosby Date: Fri, 28 Feb 2014 23:29:00 -0800 Subject: [PATCH] Don't always just append env vars, replace defaults with ones from config Docker-DCO-1.1-Signed-off-by: Michael Crosby (github: crosbymichael) --- container.go | 8 ++++---- utils/utils.go | 19 +++++++++++++++++++ utils/utils_test.go | 18 ++++++++++++++++++ 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/container.go b/container.go index ede3cfd79f..8dd672d0f9 100644 --- a/container.go +++ b/container.go @@ -507,10 +507,10 @@ func (container *Container) Start() (err error) { } } - for _, elem := range container.Config.Env { - env = append(env, elem) - } - + // because the env on the container can override certain default values + // we need to replace the 'env' keys where they match and append anything + // else. + env = utils.ReplaceOrAppendEnvValues(env, container.Config.Env) if err := container.generateEnvConfig(env); err != nil { return err } diff --git a/utils/utils.go b/utils/utils.go index f24e17c38e..fe9fb817d5 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -978,3 +978,22 @@ func NewReadCloserWrapper(r io.Reader, closer func() error) io.ReadCloser { closer: closer, } } + +// ReplaceOrAppendValues returns the defaults with the overrides either +// replaced by env key or appended to the list +func ReplaceOrAppendEnvValues(defaults, overrides []string) []string { + cache := make(map[string]int, len(defaults)) + for i, e := range defaults { + parts := strings.SplitN(e, "=", 2) + cache[parts[0]] = i + } + for _, value := range overrides { + parts := strings.SplitN(value, "=", 2) + if i, exists := cache[parts[0]]; exists { + defaults[i] = value + } else { + defaults = append(defaults, value) + } + } + return defaults +} diff --git a/utils/utils_test.go b/utils/utils_test.go index 78f4ca2bd2..ae19c89668 100644 --- a/utils/utils_test.go +++ b/utils/utils_test.go @@ -480,3 +480,21 @@ func StrSlicesEqual(a, b []string) bool { return true } + +func TestReplaceAndAppendEnvVars(t *testing.T) { + var ( + d = []string{"HOME=/"} + o = []string{"HOME=/root", "TERM=xterm"} + ) + + env := ReplaceOrAppendEnvValues(d, o) + if len(env) != 2 { + t.Fatalf("expected len of 2 got %d", len(env)) + } + if env[0] != "HOME=/root" { + t.Fatalf("expected HOME=/root got '%s'", env[0]) + } + if env[1] != "TERM=xterm" { + t.Fatalf("expected TERM=xterm got '%s'", env[1]) + } +}