Browse code

Implement ENV within docker builder

Guillaume J. Charmes authored on 2013/05/07 10:39:56
Showing 1 changed files
... ...
@@ -200,6 +200,7 @@ func (builder *Builder) Build(dockerfile io.Reader, stdout io.Writer) (*Image, e
200 200
 		image, base   *Image
201 201
 		config        *Config
202 202
 		maintainer    string
203
+		env           map[string]string   = make(map[string]string)
203 204
 		tmpContainers map[string]struct{} = make(map[string]struct{})
204 205
 		tmpImages     map[string]struct{} = make(map[string]struct{})
205 206
 	)
... ...
@@ -270,6 +271,10 @@ func (builder *Builder) Build(dockerfile io.Reader, stdout io.Writer) (*Image, e
270 270
 				return nil, err
271 271
 			}
272 272
 
273
+			for key, value := range env {
274
+				config.Env = append(config.Env, fmt.Sprintf("%s=%s", key, value))
275
+			}
276
+
273 277
 			if cache, err := builder.getCachedImage(image, config); err != nil {
274 278
 				return nil, err
275 279
 			} else if cache != nil {
... ...
@@ -278,11 +283,21 @@ func (builder *Builder) Build(dockerfile io.Reader, stdout io.Writer) (*Image, e
278 278
 				break
279 279
 			}
280 280
 
281
+			Debugf("Env -----> %v ------ %v\n", config.Env, env)
282
+
281 283
 			// Create the container and start it
282 284
 			c, err := builder.Create(config)
283 285
 			if err != nil {
284 286
 				return nil, err
285 287
 			}
288
+
289
+			if os.Getenv("DEBUG") != "" {
290
+				out, _ := c.StdoutPipe()
291
+				err2, _ := c.StderrPipe()
292
+				go io.Copy(os.Stdout, out)
293
+				go io.Copy(os.Stdout, err2)
294
+			}
295
+
286 296
 			if err := c.Start(); err != nil {
287 297
 				return nil, err
288 298
 			}
... ...
@@ -306,6 +321,21 @@ func (builder *Builder) Build(dockerfile io.Reader, stdout io.Writer) (*Image, e
306 306
 			image = base
307 307
 
308 308
 			break
309
+		case "env":
310
+			tmp := strings.SplitN(arguments, " ", 2)
311
+			if len(tmp) != 2 {
312
+				return nil, fmt.Errorf("Invalid ENV format")
313
+			}
314
+			key := strings.Trim(tmp[0], " ")
315
+			value := strings.Trim(tmp[1], " ")
316
+			fmt.Fprintf(stdout, "ENV %s %s\n", key, value)
317
+			env[key] = value
318
+			if image != nil {
319
+				fmt.Fprintf(stdout, "===> %s\n", image.ShortId())
320
+			} else {
321
+				fmt.Fprintf(stdout, "===> <nil>\n")
322
+			}
323
+			break
309 324
 		case "cmd":
310 325
 			fmt.Fprintf(stdout, "CMD %s\n", arguments)
311 326