Sfoglia il codice sorgente

'docker run -e': set environment variables in a container

Solomon Hykes 12 anni fa
parent
commit
34fbaa5f6d
3 ha cambiato i file con 25 aggiunte e 8 eliminazioni
  1. 15 0
      commands.go
  2. 10 0
      container.go
  3. 0 8
      sysinit.go

+ 15 - 0
commands.go

@@ -766,6 +766,18 @@ func (p *ports) Set(value string) error {
 	return nil
 }
 
+// ListOpts type
+type ListOpts []string
+
+func (opts *ListOpts) String() string {
+	return fmt.Sprint(*opts)
+}
+
+func (opts *ListOpts) Set(value string) error {
+	*opts = append(*opts, value)
+	return nil
+}
+
 func (srv *Server) CmdTag(stdin io.ReadCloser, stdout io.Writer, args ...string) error {
 	cmd := rcli.Subcmd(stdout, "tag", "[OPTIONS] IMAGE REPOSITORY [TAG]", "Tag an image into a repository")
 	force := cmd.Bool("f", false, "Force")
@@ -789,6 +801,8 @@ func (srv *Server) CmdRun(stdin io.ReadCloser, stdout io.Writer, args ...string)
 	var fl_ports ports
 
 	cmd.Var(&fl_ports, "p", "Map a network port to the container")
+	var fl_env ListOpts
+	cmd.Var(&fl_env, "e", "Set environment variables")
 	if err := cmd.Parse(args); err != nil {
 		return nil
 	}
@@ -819,6 +833,7 @@ func (srv *Server) CmdRun(stdin io.ReadCloser, stdout io.Writer, args ...string)
 			Tty:       *fl_tty,
 			OpenStdin: *fl_stdin,
 			Memory:    *fl_memory,
+			Env:       fl_env,
 		})
 	if err != nil {
 		return errors.New("Error creating container: " + err.Error())

+ 10 - 0
container.go

@@ -53,6 +53,7 @@ type Config struct {
 	Ports      []int
 	Tty        bool // Attach standard streams to a tty, including stdin if it is not closed.
 	OpenStdin  bool // Open stdin
+	Env        []string
 }
 
 type NetworkSettings struct {
@@ -200,6 +201,15 @@ func (container *Container) Start() error {
 
 	container.cmd = exec.Command("/usr/bin/lxc-start", params...)
 
+	// Setup environment
+	container.cmd.Env = append(
+		[]string{
+			"HOME=/",
+			"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
+		},
+		container.Config.Env...,
+	)
+
 	var err error
 	if container.Config.Tty {
 		err = container.startPty()

+ 0 - 8
sysinit.go

@@ -52,13 +52,6 @@ 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 {
@@ -86,6 +79,5 @@ func SysInit() {
 
 	setupNetworking(*gw)
 	changeUser(*u)
-	setupEnv()
 	executeProgram(flag.Arg(0), flag.Args())
 }