Merge pull request #504 from dotcloud/builder-autorun

+ Builder: Implement the autorun capability within docker builder
This commit is contained in:
Guillaume J. Charmes 2013-05-06 17:20:55 -07:00 коммит произвёл Guillaume J. Charmes
Родитель d581f0808c 3439cd9cea
Коммит f3f2cba386
1 изменённых файлов: 36 добавлений и 3 удалений

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

@ -2,6 +2,7 @@ package docker
import ( import (
"bufio" "bufio"
"encoding/json"
"fmt" "fmt"
"io" "io"
"os" "os"
@ -197,6 +198,7 @@ func (builder *Builder) getCachedImage(image *Image, config *Config) (*Image, er
func (builder *Builder) Build(dockerfile io.Reader, stdout io.Writer) (*Image, error) { func (builder *Builder) Build(dockerfile io.Reader, stdout io.Writer) (*Image, error) {
var ( var (
image, base *Image image, base *Image
config *Config
maintainer string maintainer 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{})
@ -251,9 +253,10 @@ func (builder *Builder) Build(dockerfile io.Reader, stdout io.Writer) (*Image, e
return nil, err return nil, err
} }
} }
config = &Config{}
break break
case "mainainer": case "maintainer":
fmt.Fprintf(stdout, "MAINTAINER %s\n", arguments) fmt.Fprintf(stdout, "MAINTAINER %s\n", arguments)
maintainer = arguments maintainer = arguments
break break
@ -302,6 +305,35 @@ 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 "cmd":
fmt.Fprintf(stdout, "CMD %s\n", arguments)
// Create the container and start it
c, err := builder.Create(&Config{Image: image.Id, Cmd: []string{"", ""}})
if err != nil {
return nil, err
}
if err := c.Start(); err != nil {
return nil, err
}
tmpContainers[c.Id] = struct{}{}
cmd := []string{}
if err := json.Unmarshal([]byte(arguments), &cmd); err != nil {
return nil, err
}
config.Cmd = cmd
// Commit the container
base, err = builder.Commit(c, "", "", "", maintainer, config)
if err != nil {
return nil, err
}
tmpImages[base.Id] = struct{}{}
fmt.Fprintf(stdout, "===> %s\n", base.ShortId())
image = base
break break
case "expose": case "expose":
ports := strings.Split(arguments, " ") ports := strings.Split(arguments, " ")
@ -321,15 +353,16 @@ func (builder *Builder) Build(dockerfile io.Reader, stdout io.Writer) (*Image, e
} }
tmpContainers[c.Id] = struct{}{} tmpContainers[c.Id] = struct{}{}
config.PortSpecs = append(ports, config.PortSpecs...)
// Commit the container // Commit the container
base, err = builder.Commit(c, "", "", "", maintainer, &Config{PortSpecs: ports}) base, err = builder.Commit(c, "", "", "", maintainer, config)
if err != nil { if err != nil {
return nil, err return nil, err
} }
tmpImages[base.Id] = struct{}{} tmpImages[base.Id] = struct{}{}
fmt.Fprintf(stdout, "===> %s\n", base.ShortId()) fmt.Fprintf(stdout, "===> %s\n", base.ShortId())
image = base image = base
break break
case "insert": case "insert":