Przeglądaj źródła

Merge pull request #537 from dotcloud/builder-env

+ Builder: Implement ENV within docker builder
Guillaume J. Charmes 12 lat temu
rodzic
commit
a02ad8c896
2 zmienionych plików z 40 dodań i 1 usunięć
  1. 30 0
      builder.go
  2. 10 1
      docs/sources/builder/basics.rst

+ 30 - 0
builder.go

@@ -200,6 +200,7 @@ func (builder *Builder) Build(dockerfile io.Reader, stdout io.Writer) (*Image, e
 		image, base   *Image
 		config        *Config
 		maintainer    string
+		env           map[string]string   = make(map[string]string)
 		tmpContainers map[string]struct{} = make(map[string]struct{})
 		tmpImages     map[string]struct{} = make(map[string]struct{})
 	)
@@ -270,6 +271,10 @@ func (builder *Builder) Build(dockerfile io.Reader, stdout io.Writer) (*Image, e
 				return nil, err
 			}
 
+			for key, value := range env {
+				config.Env = append(config.Env, fmt.Sprintf("%s=%s", key, value))
+			}
+
 			if cache, err := builder.getCachedImage(image, config); err != nil {
 				return nil, err
 			} else if cache != nil {
@@ -278,11 +283,21 @@ func (builder *Builder) Build(dockerfile io.Reader, stdout io.Writer) (*Image, e
 				break
 			}
 
+			Debugf("Env -----> %v ------ %v\n", config.Env, env)
+
 			// Create the container and start it
 			c, err := builder.Create(config)
 			if err != nil {
 				return nil, err
 			}
+
+			if os.Getenv("DEBUG") != "" {
+				out, _ := c.StdoutPipe()
+				err2, _ := c.StderrPipe()
+				go io.Copy(os.Stdout, out)
+				go io.Copy(os.Stdout, err2)
+			}
+
 			if err := c.Start(); err != nil {
 				return nil, err
 			}
@@ -305,6 +320,21 @@ func (builder *Builder) Build(dockerfile io.Reader, stdout io.Writer) (*Image, e
 			// use the base as the new image
 			image = base
 
+			break
+		case "env":
+			tmp := strings.SplitN(arguments, " ", 2)
+			if len(tmp) != 2 {
+				return nil, fmt.Errorf("Invalid ENV format")
+			}
+			key := strings.Trim(tmp[0], " ")
+			value := strings.Trim(tmp[1], " ")
+			fmt.Fprintf(stdout, "ENV %s %s\n", key, value)
+			env[key] = value
+			if image != nil {
+				fmt.Fprintf(stdout, "===> %s\n", image.ShortId())
+			} else {
+				fmt.Fprintf(stdout, "===> <nil>\n")
+			}
 			break
 		case "cmd":
 			fmt.Fprintf(stdout, "CMD %s\n", arguments)

+ 10 - 1
docs/sources/builder/basics.rst

@@ -66,7 +66,16 @@ It is equivalent to do `docker commit -run '{"Cmd": <command>}'` outside the bui
 The `EXPOSE` instruction sets ports to be publicly exposed when running the image.
 This is equivalent to do `docker commit -run '{"PortSpecs": ["<port>", "<port2>"]}'` outside the builder.
 
-2.6 INSERT
+2.6 ENV
+-------
+    ``ENV <key> <value>``
+
+The `ENV` instruction set as environment variable `<key>` with the value `<value>`. This value will be passed to all future ``RUN`` instructions.
+
+.. note::
+    The environment variables are local to the Dockerfile, they will not be set as autorun.
+
+2.7 INSERT
 ----------
 
     ``INSERT <file url> <path>``