зеркало из https://github.com/microsoft/docker.git
Merge pull request #504 from dotcloud/builder-autorun
+ Builder: Implement the autorun capability within docker builder
This commit is contained in:
Коммит
f3f2cba386
39
builder.go
39
builder.go
|
@ -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":
|
||||||
|
|
Загрузка…
Ссылка в новой задаче