Merge pull request #537 from dotcloud/builder-env

+ Builder: Implement ENV within docker builder
This commit is contained in:
Guillaume J. Charmes 2013-05-06 18:57:15 -07:00
Родитель 8472a27e80 4c7c177e4e
Коммит a02ad8c896
2 изменённых файлов: 40 добавлений и 1 удалений

Просмотреть файл

@ -200,6 +200,7 @@ func (builder *Builder) Build(dockerfile io.Reader, stdout io.Writer) (*Image, e
image, base *Image image, base *Image
config *Config config *Config
maintainer string maintainer string
env map[string]string = make(map[string]string)
tmpContainers map[string]struct{} = make(map[string]struct{}) tmpContainers map[string]struct{} = make(map[string]struct{})
tmpImages 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 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 { if cache, err := builder.getCachedImage(image, config); err != nil {
return nil, err return nil, err
} else if cache != nil { } else if cache != nil {
@ -278,11 +283,21 @@ func (builder *Builder) Build(dockerfile io.Reader, stdout io.Writer) (*Image, e
break break
} }
Debugf("Env -----> %v ------ %v\n", config.Env, env)
// Create the container and start it // Create the container and start it
c, err := builder.Create(config) c, err := builder.Create(config)
if err != nil { if err != nil {
return nil, err 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 { if err := c.Start(); err != nil {
return nil, err 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 // use the base as the new image
image = base 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 break
case "cmd": case "cmd":
fmt.Fprintf(stdout, "CMD %s\n", arguments) fmt.Fprintf(stdout, "CMD %s\n", arguments)

Просмотреть файл

@ -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. 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. 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>`` ``INSERT <file url> <path>``