diff --git a/container_test.go b/container_test.go index 17ec85c6b1..8c187ecb97 100644 --- a/container_test.go +++ b/container_test.go @@ -4,6 +4,7 @@ import ( "fmt" "io" "io/ioutil" + "sort" "strings" "testing" "time" @@ -511,6 +512,55 @@ func TestTty(t *testing.T) { } } +func TestEnv(t *testing.T) { + docker, err := newTestDocker() + if err != nil { + t.Fatal(err) + } + container, err := docker.Create( + "env_test", + "/usr/bin/env", + []string{}, + []string{testLayerPath}, + &Config{}, + ) + if err != nil { + t.Fatal(err) + } + defer docker.Destroy(container) + stdout, err := container.StdoutPipe() + if err != nil { + t.Fatal(err) + } + defer stdout.Close() + if err := container.Start(); err != nil { + t.Fatal(err) + } + container.Wait() + output, err := ioutil.ReadAll(stdout) + if err != nil { + t.Fatal(err) + } + actualEnv := strings.Split(string(output), "\n") + if actualEnv[len(actualEnv)-1] == "" { + actualEnv = actualEnv[:len(actualEnv)-1] + } + sort.Strings(actualEnv) + goodEnv := []string{ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "HOME=/", + } + sort.Strings(goodEnv) + if len(goodEnv) != len(actualEnv) { + t.Fatalf("Wrong environment: should be %d variables, not: '%s'\n", len(goodEnv), strings.Join(actualEnv, ", ")) + } + for i := range goodEnv { + if actualEnv[i] != goodEnv[i] { + t.Fatalf("Wrong environment variable: should be %s, not %s", goodEnv[i], actualEnv[i]) + } + } +} + func BenchmarkRunSequencial(b *testing.B) { docker, err := newTestDocker() if err != nil { diff --git a/sysinit.go b/sysinit.go index f701417978..c475b3365d 100644 --- a/sysinit.go +++ b/sysinit.go @@ -52,6 +52,13 @@ func changeUser(u string) { } } +// Set the environment to a known, repeatable state +func setupEnv() { + os.Clearenv() + os.Setenv("HOME", "/") + os.Setenv("PATH", "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin") +} + func executeProgram(name string, args []string) { path, err := exec.LookPath(name) if err != nil { @@ -79,5 +86,6 @@ func SysInit() { setupNetworking(*gw) changeUser(*u) + setupEnv() executeProgram(flag.Arg(0), flag.Args()) }