The /.dockerenv file is now a marshalled json array so that environment
variables with \n and other weird values are supported.
| ... | ... |
@@ -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 {
|