Browse code

Fixed problem with variables containing \n.

The /.dockerenv file is now a marshalled json array so that environment
variables with \n and other weird values are supported.

Brian Olsen authored on 2013/08/15 09:14:30
Showing 3 changed files
... ...
@@ -444,16 +444,11 @@ func (container *Container) SaveHostConfig(hostConfig *HostConfig) (err error) {
444 444
 }
445 445
 
446 446
 func (container *Container) generateEnvConfig(env []string) error {
447
-	fo, err := os.Create(container.EnvConfigPath())
447
+	data, err := json.Marshal(env)
448 448
 	if err != nil {
449 449
 		return err
450 450
 	}
451
-	defer fo.Close()
452
-	for _, item := range env {
453
-		if _, err := fo.WriteString(item + "\n"); err != nil {
454
-			return err
455
-		}
456
-	}
451
+	ioutil.WriteFile(container.EnvConfigPath(), data, 0600)
457 452
 	return nil
458 453
 }
459 454
 
... ...
@@ -974,9 +974,10 @@ func TestTty(t *testing.T) {
974 974
 
975 975
 func TestEnv(t *testing.T) {
976 976
 	os.Setenv("TRUE", "false")
977
+	os.Setenv("TRICKY", "tri\ncky\n")
977 978
 	runtime := mkRuntime(t)
978 979
 	defer nuke(runtime)
979
-	config, _, _, err := ParseRun([]string{"-e=FALSE=true", "-e=TRUE", GetTestImage(runtime).ID, "env"}, nil)
980
+	config, _, _, err := ParseRun([]string{"-e=FALSE=true", "-e=TRUE", "-e=TRICKY", GetTestImage(runtime).ID, "env"}, nil)
980 981
 	if err != nil {
981 982
 		t.Fatal(err)
982 983
 	}
... ...
@@ -1012,6 +1013,9 @@ func TestEnv(t *testing.T) {
1012 1012
 		"HOSTNAME=" + container.ShortID(),
1013 1013
 		"FALSE=true",
1014 1014
 		"TRUE=false",
1015
+		"TRICKY=tri",
1016
+		"cky",
1017
+		"",
1015 1018
 	}
1016 1019
 	sort.Strings(goodEnv)
1017 1020
 	if len(goodEnv) != len(actualEnv) {
... ...
@@ -1,6 +1,7 @@
1 1
 package sysinit
2 2
 
3 3
 import (
4
+	"encoding/json"
4 5
 	"flag"
5 6
 	"fmt"
6 7
 	"github.com/dotcloud/docker/netlink"
... ...
@@ -72,11 +73,15 @@ func changeUser(u string) {
72 72
 // Clear environment pollution introduced by lxc-start
73 73
 func cleanupEnv() {
74 74
 	os.Clearenv()
75
+	var lines []string
75 76
 	content, err := ioutil.ReadFile("/.dockerenv")
76 77
 	if err != nil {
77 78
 		log.Fatalf("Unable to load environment variables: %v", err)
78 79
 	}
79
-	lines := strings.Split(string(content), "\n")
80
+	err = json.Unmarshal(content, &lines)
81
+	if err != nil {
82
+		log.Fatalf("Unable to unmarshal environment variables: %v", err)
83
+	}
80 84
 	for _, kv := range lines {
81 85
 		parts := strings.SplitN(kv, "=", 2)
82 86
 		if len(parts) == 1 {