diff --git a/container.go b/container.go index 8b7f98955f..9448932674 100644 --- a/container.go +++ b/container.go @@ -444,16 +444,11 @@ func (container *Container) SaveHostConfig(hostConfig *HostConfig) (err error) { } func (container *Container) generateEnvConfig(env []string) error { - fo, err := os.Create(container.EnvConfigPath()) + data, err := json.Marshal(env) if err != nil { return err } - defer fo.Close() - for _, item := range env { - if _, err := fo.WriteString(item + "\n"); err != nil { - return err - } - } + ioutil.WriteFile(container.EnvConfigPath(), data, 0600) return nil } diff --git a/container_test.go b/container_test.go index 90ca6defea..69495d6d81 100644 --- a/container_test.go +++ b/container_test.go @@ -974,9 +974,10 @@ func TestTty(t *testing.T) { func TestEnv(t *testing.T) { os.Setenv("TRUE", "false") + os.Setenv("TRICKY", "tri\ncky\n") runtime := mkRuntime(t) defer nuke(runtime) - config, _, _, err := ParseRun([]string{"-e=FALSE=true", "-e=TRUE", GetTestImage(runtime).ID, "env"}, nil) + config, _, _, err := ParseRun([]string{"-e=FALSE=true", "-e=TRUE", "-e=TRICKY", GetTestImage(runtime).ID, "env"}, nil) if err != nil { t.Fatal(err) } @@ -1012,6 +1013,9 @@ func TestEnv(t *testing.T) { "HOSTNAME=" + container.ShortID(), "FALSE=true", "TRUE=false", + "TRICKY=tri", + "cky", + "", } sort.Strings(goodEnv) if len(goodEnv) != len(actualEnv) { diff --git a/sysinit/sysinit.go b/sysinit/sysinit.go index 05ee9c08ce..63e91a02e4 100644 --- a/sysinit/sysinit.go +++ b/sysinit/sysinit.go @@ -1,6 +1,7 @@ package sysinit import ( + "encoding/json" "flag" "fmt" "github.com/dotcloud/docker/netlink" @@ -72,11 +73,15 @@ func changeUser(u string) { // Clear environment pollution introduced by lxc-start func cleanupEnv() { os.Clearenv() + var lines []string content, err := ioutil.ReadFile("/.dockerenv") if err != nil { log.Fatalf("Unable to load environment variables: %v", err) } - lines := strings.Split(string(content), "\n") + err = json.Unmarshal(content, &lines) + if err != nil { + log.Fatalf("Unable to unmarshal environment variables: %v", err) + } for _, kv := range lines { parts := strings.SplitN(kv, "=", 2) if len(parts) == 1 {