diff --git a/buildfile.go b/buildfile.go index e4b3d28e9c..da72be60fb 100644 --- a/buildfile.go +++ b/buildfile.go @@ -7,6 +7,7 @@ import ( "errors" "fmt" "github.com/dotcloud/docker/archive" + "github.com/dotcloud/docker/nat" "github.com/dotcloud/docker/registry" "github.com/dotcloud/docker/runconfig" "github.com/dotcloud/docker/runtime" @@ -304,8 +305,22 @@ func (b *buildFile) CmdEntrypoint(args string) error { } func (b *buildFile) CmdExpose(args string) error { - ports := strings.Split(args, " ") - b.config.PortSpecs = append(ports, b.config.PortSpecs...) + portsTab := strings.Split(args, " ") + + if b.config.ExposedPorts == nil { + b.config.ExposedPorts = make(nat.PortSet) + } + ports, _, err := nat.ParsePortSpecs(append(portsTab, b.config.PortSpecs...)) + if err != nil { + return err + } + for port := range ports { + if _, exists := b.config.ExposedPorts[port]; !exists { + b.config.ExposedPorts[port] = struct{}{} + } + } + b.config.PortSpecs = nil + return b.commit("", b.config.Cmd, fmt.Sprintf("EXPOSE %v", ports)) } @@ -686,12 +701,12 @@ func (b *buildFile) commit(id string, autoCmd []string, comment string) error { b.tmpContainers[container.ID] = struct{}{} fmt.Fprintf(b.outStream, " ---> Running in %s\n", utils.TruncateID(container.ID)) id = container.ID + if err := container.Mount(); err != nil { return err } defer container.Unmount() } - container := b.runtime.Get(id) if container == nil { return fmt.Errorf("An error occured while creating the container") diff --git a/integration/buildfile_test.go b/integration/buildfile_test.go index e5084d4355..f4ed61aaff 100644 --- a/integration/buildfile_test.go +++ b/integration/buildfile_test.go @@ -6,6 +6,7 @@ import ( "github.com/dotcloud/docker/archive" "github.com/dotcloud/docker/engine" "github.com/dotcloud/docker/image" + "github.com/dotcloud/docker/nat" "github.com/dotcloud/docker/utils" "io/ioutil" "net" @@ -492,7 +493,7 @@ func TestBuildExpose(t *testing.T) { t.Fatal(err) } - if img.Config.PortSpecs[0] != "4243" { + if _, exists := img.Config.ExposedPorts[nat.NewPort("tcp", "4243")]; !exists { t.Fail() } } @@ -594,6 +595,17 @@ func TestBuildImageWithCache(t *testing.T) { checkCacheBehavior(t, template, true) } +func TestBuildExposeWithCache(t *testing.T) { + template := testContextTemplate{` + from {IMAGE} + maintainer dockerio + expose 80 + run echo hello + `, + nil, nil} + checkCacheBehavior(t, template, true) +} + func TestBuildImageWithoutCache(t *testing.T) { template := testContextTemplate{` from {IMAGE} @@ -877,7 +889,7 @@ func TestBuildInheritance(t *testing.T) { } // from parent - if img.Config.PortSpecs[0] != "4243" { + if _, exists := img.Config.ExposedPorts[nat.NewPort("tcp", "4243")]; !exists { t.Fail() } } diff --git a/runconfig/merge.go b/runconfig/merge.go index a8d677baa8..3b91aa2af0 100644 --- a/runconfig/merge.go +++ b/runconfig/merge.go @@ -64,6 +64,7 @@ func Merge(userConf, imageConf *Config) error { } } } + if !userConf.Tty { userConf.Tty = imageConf.Tty } diff --git a/runtime/runtime.go b/runtime/runtime.go index 16117b9788..32584cbf6e 100644 --- a/runtime/runtime.go +++ b/runtime/runtime.go @@ -534,7 +534,6 @@ func (runtime *Runtime) Create(config *runconfig.Config, name string) (*Containe // The image can optionally be tagged into a repository func (runtime *Runtime) Commit(container *Container, repository, tag, comment, author string, config *runconfig.Config) (*image.Image, error) { // FIXME: freeze the container before copying it to avoid data corruption? - // FIXME: this shouldn't be in commands. if err := container.Mount(); err != nil { return nil, err } diff --git a/server.go b/server.go index d4d6a39158..75fa633e8f 100644 --- a/server.go +++ b/server.go @@ -1970,7 +1970,6 @@ func (srv *Server) canDeleteImage(imgID string) error { } func (srv *Server) ImageGetCached(imgID string, config *runconfig.Config) (*image.Image, error) { - // Retrieve all images images, err := srv.runtime.Graph().Map() if err != nil {