... | ... |
@@ -431,6 +431,20 @@ func (container *Container) SaveHostConfig(hostConfig *HostConfig) (err error) { |
431 | 431 |
return ioutil.WriteFile(container.hostConfigPath(), data, 0666) |
432 | 432 |
} |
433 | 433 |
|
434 |
+func (container *Container) generateEnvConfig(env []string) error { |
|
435 |
+ fo, err := os.Create(container.EnvConfigPath()) |
|
436 |
+ if err != nil { |
|
437 |
+ return err |
|
438 |
+ } |
|
439 |
+ defer fo.Close() |
|
440 |
+ for _, item := range env { |
|
441 |
+ if _, err := fo.WriteString(item + "\n"); err != nil { |
|
442 |
+ return err |
|
443 |
+ } |
|
444 |
+ } |
|
445 |
+ return nil |
|
446 |
+} |
|
447 |
+ |
|
434 | 448 |
func (container *Container) generateLXCConfig(hostConfig *HostConfig) error { |
435 | 449 |
fo, err := os.Create(container.lxcConfigPath()) |
436 | 450 |
if err != nil { |
... | ... |
@@ -841,17 +855,17 @@ func (container *Container) Start(hostConfig *HostConfig) (err error) { |
841 | 841 |
params = append(params, "-u", container.Config.User) |
842 | 842 |
} |
843 | 843 |
|
844 |
- if container.Config.Tty { |
|
845 |
- params = append(params, "-e", "TERM=xterm") |
|
844 |
+ // Setup environment |
|
845 |
+ env := []string{ |
|
846 |
+ "HOME=/", |
|
847 |
+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", |
|
848 |
+ "container=lxc", |
|
849 |
+ "HOSTNAME=" + container.Config.Hostname, |
|
846 | 850 |
} |
847 | 851 |
|
848 |
- // Setup environment |
|
849 |
- params = append(params, |
|
850 |
- "-e", "HOME=/", |
|
851 |
- "-e", "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", |
|
852 |
- "-e", "container=lxc", |
|
853 |
- "-e", "HOSTNAME="+container.Config.Hostname, |
|
854 |
- ) |
|
852 |
+ if container.Config.Tty { |
|
853 |
+ env = append(env, "TERM=xterm") |
|
854 |
+ } |
|
855 | 855 |
|
856 | 856 |
// Init any links between the parent and children |
857 | 857 |
runtime := container.runtime |
... | ... |
@@ -887,11 +901,19 @@ func (container *Container) Start(hostConfig *HostConfig) (err error) { |
887 | 887 |
} |
888 | 888 |
|
889 | 889 |
for _, envVar := range link.ToEnv() { |
890 |
- params = append(params, "-e", envVar) |
|
890 |
+ env = append(env, envVar) |
|
891 | 891 |
} |
892 | 892 |
} |
893 | 893 |
} |
894 | 894 |
|
895 |
+ for _, elem := range container.Config.Env { |
|
896 |
+ env = append(env, elem) |
|
897 |
+ } |
|
898 |
+ |
|
899 |
+ if err := container.generateEnvConfig(env); err != nil { |
|
900 |
+ return err |
|
901 |
+ } |
|
902 |
+ |
|
895 | 903 |
if container.Config.WorkingDir != "" { |
896 | 904 |
workingDir := path.Clean(container.Config.WorkingDir) |
897 | 905 |
utils.Debugf("[working dir] working dir is %s", workingDir) |
... | ... |
@@ -905,10 +927,6 @@ func (container *Container) Start(hostConfig *HostConfig) (err error) { |
905 | 905 |
) |
906 | 906 |
} |
907 | 907 |
|
908 |
- for _, elem := range container.Config.Env { |
|
909 |
- params = append(params, "-e", elem) |
|
910 |
- } |
|
911 |
- |
|
912 | 908 |
// Program |
913 | 909 |
params = append(params, "--", container.Path) |
914 | 910 |
params = append(params, container.Args...) |
... | ... |
@@ -1416,6 +1434,10 @@ func (container *Container) jsonPath() string { |
1416 | 1416 |
return path.Join(container.root, "config.json") |
1417 | 1417 |
} |
1418 | 1418 |
|
1419 |
+func (container *Container) EnvConfigPath() string { |
|
1420 |
+ return path.Join(container.root, "config.env") |
|
1421 |
+} |
|
1422 |
+ |
|
1419 | 1423 |
func (container *Container) lxcConfigPath() string { |
1420 | 1424 |
return path.Join(container.root, "config.lxc") |
1421 | 1425 |
} |
... | ... |
@@ -97,6 +97,9 @@ lxc.mount.entry = shm {{$ROOTFS}}/dev/shm tmpfs size=65536k,nosuid,nodev,noexec |
97 | 97 |
# Inject dockerinit |
98 | 98 |
lxc.mount.entry = {{.SysInitPath}} {{$ROOTFS}}/.dockerinit none bind,ro 0 0 |
99 | 99 |
|
100 |
+# Inject env |
|
101 |
+lxc.mount.entry = {{.EnvConfigPath}} {{$ROOTFS}}/.dockerenv none bind,ro 0 0 |
|
102 |
+ |
|
100 | 103 |
# In order to get a working DNS environment, mount bind (ro) the host's /etc/resolv.conf into the container |
101 | 104 |
lxc.mount.entry = {{.ResolvConfPath}} {{$ROOTFS}}/etc/resolv.conf none bind,ro 0 0 |
102 | 105 |
{{if .Volumes}} |
... | ... |
@@ -5,6 +5,7 @@ import ( |
5 | 5 |
"fmt" |
6 | 6 |
"github.com/dotcloud/docker/netlink" |
7 | 7 |
"github.com/dotcloud/docker/utils" |
8 |
+ "io/ioutil" |
|
8 | 9 |
"log" |
9 | 10 |
"net" |
10 | 11 |
"os" |
... | ... |
@@ -69,9 +70,14 @@ func changeUser(u string) { |
69 | 69 |
} |
70 | 70 |
|
71 | 71 |
// Clear environment pollution introduced by lxc-start |
72 |
-func cleanupEnv(env utils.ListOpts) { |
|
72 |
+func cleanupEnv() { |
|
73 | 73 |
os.Clearenv() |
74 |
- for _, kv := range env { |
|
74 |
+ content, err := ioutil.ReadFile("/.dockerenv") |
|
75 |
+ if err != nil { |
|
76 |
+ log.Fatalf("Unable to load environment variables: %v", err) |
|
77 |
+ } |
|
78 |
+ lines := strings.Split(string(content), "\n") |
|
79 |
+ for _, kv := range lines { |
|
75 | 80 |
parts := strings.SplitN(kv, "=", 2) |
76 | 81 |
if len(parts) == 1 { |
77 | 82 |
parts = append(parts, "") |
... | ... |
@@ -104,12 +110,9 @@ func SysInit() { |
104 | 104 |
var gw = flag.String("g", "", "gateway address") |
105 | 105 |
var workdir = flag.String("w", "", "workdir") |
106 | 106 |
|
107 |
- var flEnv utils.ListOpts |
|
108 |
- flag.Var(&flEnv, "e", "Set environment variables") |
|
109 |
- |
|
110 | 107 |
flag.Parse() |
111 | 108 |
|
112 |
- cleanupEnv(flEnv) |
|
109 |
+ cleanupEnv() |
|
113 | 110 |
setupNetworking(*gw) |
114 | 111 |
setupWorkingDirectory(*workdir) |
115 | 112 |
changeUser(*u) |