diff --git a/api/server/router/container/backend.go b/api/server/router/container/backend.go index 33bf3c5b7a..0f2f06bfcc 100644 --- a/api/server/router/container/backend.go +++ b/api/server/router/container/backend.go @@ -32,7 +32,7 @@ type copyBackend interface { // stateBackend includes functions to implement to provide container state lifecycle functionality. type stateBackend interface { - ContainerCreate(params *daemon.ContainerCreateConfig) (types.ContainerCreateResponse, error) + ContainerCreate(types.ContainerCreateConfig) (types.ContainerCreateResponse, error) ContainerKill(name string, sig uint64) error ContainerPause(name string) error ContainerRename(oldName, newName string) error diff --git a/api/server/router/container/container_routes.go b/api/server/router/container/container_routes.go index 94c8a9661f..beea7a8f25 100644 --- a/api/server/router/container/container_routes.go +++ b/api/server/router/container/container_routes.go @@ -339,7 +339,7 @@ func (s *containerRouter) postContainersCreate(ctx context.Context, w http.Respo version := httputils.VersionFromContext(ctx) adjustCPUShares := version.LessThan("1.19") - ccr, err := s.backend.ContainerCreate(&daemon.ContainerCreateConfig{ + ccr, err := s.backend.ContainerCreate(types.ContainerCreateConfig{ Name: name, Config: config, HostConfig: hostConfig, diff --git a/api/types/configs.go b/api/types/configs.go index 2551a0b3b4..c166ac7e51 100644 --- a/api/types/configs.go +++ b/api/types/configs.go @@ -8,6 +8,14 @@ import ( "github.com/docker/docker/runconfig" ) +// ContainerCreateConfig is the parameter set to ContainerCreate() +type ContainerCreateConfig struct { + Name string + Config *runconfig.Config + HostConfig *runconfig.HostConfig + AdjustCPUShares bool +} + // ContainerRmConfig holds arguments for the container remove // operation. This struct is used to tell the backend what operations // to perform. diff --git a/builder/builder.go b/builder/builder.go index 07293f4f8e..974cec7017 100644 --- a/builder/builder.go +++ b/builder/builder.go @@ -10,8 +10,6 @@ import ( "time" "github.com/docker/docker/api/types" - "github.com/docker/docker/daemon" - "github.com/docker/docker/image" "github.com/docker/docker/runconfig" ) @@ -112,13 +110,13 @@ type Backend interface { // TODO: use digest reference instead of name // GetImage looks up a Docker image referenced by `name`. - GetImage(name string) (*image.Image, error) + GetImage(name string) (Image, error) // Pull tells Docker to pull image referenced by `name`. - Pull(name string) (*image.Image, error) - // ContainerWsAttachWithLogs attaches to container. - ContainerWsAttachWithLogs(name string, cfg *daemon.ContainerWsAttachWithLogsConfig) error + Pull(name string) (Image, error) + // ContainerAttach attaches to container. + ContainerAttach(cID string, stdin io.ReadCloser, stdout, stderr io.Writer, stream bool) error // ContainerCreate creates a new Docker container and returns potential warnings - ContainerCreate(params *daemon.ContainerCreateConfig) (types.ContainerCreateResponse, error) + ContainerCreate(types.ContainerCreateConfig) (types.ContainerCreateResponse, error) // ContainerRm removes a container specified by `id`. ContainerRm(name string, config *types.ContainerRmConfig) error // Commit creates a new Docker image from an existing Docker container. diff --git a/builder/dockerfile/dispatchers.go b/builder/dockerfile/dispatchers.go index 038a2c8c61..0f6c0b78d2 100644 --- a/builder/dockerfile/dispatchers.go +++ b/builder/dockerfile/dispatchers.go @@ -18,8 +18,8 @@ import ( "strings" "github.com/Sirupsen/logrus" + "github.com/docker/docker/builder" derr "github.com/docker/docker/errors" - "github.com/docker/docker/image" flag "github.com/docker/docker/pkg/mflag" "github.com/docker/docker/pkg/nat" "github.com/docker/docker/pkg/signal" @@ -210,7 +210,7 @@ func from(b *Builder, args []string, attributes map[string]bool, original string } var ( - image *image.Image + image builder.Image err error ) // TODO: don't use `name`, instead resolve it to a digest diff --git a/builder/dockerfile/internals.go b/builder/dockerfile/internals.go index c8e674d7bc..e439516621 100644 --- a/builder/dockerfile/internals.go +++ b/builder/dockerfile/internals.go @@ -23,8 +23,6 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/builder" "github.com/docker/docker/builder/dockerfile/parser" - "github.com/docker/docker/daemon" - "github.com/docker/docker/image" "github.com/docker/docker/pkg/archive" "github.com/docker/docker/pkg/httputils" "github.com/docker/docker/pkg/ioutils" @@ -185,7 +183,7 @@ func (b *Builder) runContextCommand(args []string, allowRemote bool, allowLocalD return nil } - container, err := b.docker.ContainerCreate(&daemon.ContainerCreateConfig{Config: b.runConfig}) + container, err := b.docker.ContainerCreate(types.ContainerCreateConfig{Config: b.runConfig}) if err != nil { return err } @@ -395,11 +393,11 @@ func containsWildcards(name string) bool { return false } -func (b *Builder) processImageFrom(img *image.Image) error { - b.image = img.ID().String() +func (b *Builder) processImageFrom(img builder.Image) error { + b.image = img.ID() if img.Config != nil { - b.runConfig = img.Config + b.runConfig = img.Config() } // The default path will be blank on Windows (set by HCS) @@ -500,7 +498,7 @@ func (b *Builder) create() (string, error) { config := *b.runConfig // Create the container - c, err := b.docker.ContainerCreate(&daemon.ContainerCreateConfig{ + c, err := b.docker.ContainerCreate(types.ContainerCreateConfig{ Config: b.runConfig, HostConfig: hostConfig, }) @@ -528,11 +526,7 @@ func (b *Builder) run(cID string) (err error) { errCh := make(chan error) if b.Verbose { go func() { - errCh <- b.docker.ContainerWsAttachWithLogs(cID, &daemon.ContainerWsAttachWithLogsConfig{ - OutStream: b.Stdout, - ErrStream: b.Stderr, - Stream: true, - }) + errCh <- b.docker.ContainerAttach(cID, nil, b.Stdout, b.Stderr, true) }() } diff --git a/builder/image.go b/builder/image.go new file mode 100644 index 0000000000..c8d5fc15d9 --- /dev/null +++ b/builder/image.go @@ -0,0 +1,9 @@ +package builder + +import "github.com/docker/docker/runconfig" + +// Image represents a Docker image used by the builder. +type Image interface { + ID() string + Config() *runconfig.Config +} diff --git a/daemon/create.go b/daemon/create.go index 17f462b507..4767874d8c 100644 --- a/daemon/create.go +++ b/daemon/create.go @@ -13,23 +13,15 @@ import ( "github.com/opencontainers/runc/libcontainer/label" ) -// ContainerCreateConfig is the parameter set to ContainerCreate() -type ContainerCreateConfig struct { - Name string - Config *runconfig.Config - HostConfig *runconfig.HostConfig - AdjustCPUShares bool -} - -// ContainerCreate takes configs and creates a container. -func (daemon *Daemon) ContainerCreate(params *ContainerCreateConfig) (types.ContainerCreateResponse, error) { +// ContainerCreate creates a container. +func (daemon *Daemon) ContainerCreate(params types.ContainerCreateConfig) (types.ContainerCreateResponse, error) { if params.Config == nil { return types.ContainerCreateResponse{}, derr.ErrorCodeEmptyConfig } warnings, err := daemon.verifyContainerSettings(params.HostConfig, params.Config) if err != nil { - return types.ContainerCreateResponse{ID: "", Warnings: warnings}, err + return types.ContainerCreateResponse{Warnings: warnings}, err } if params.HostConfig == nil { @@ -37,24 +29,25 @@ func (daemon *Daemon) ContainerCreate(params *ContainerCreateConfig) (types.Cont } err = daemon.adaptContainerSettings(params.HostConfig, params.AdjustCPUShares) if err != nil { - return types.ContainerCreateResponse{ID: "", Warnings: warnings}, err + return types.ContainerCreateResponse{Warnings: warnings}, err } container, err := daemon.create(params) if err != nil { - return types.ContainerCreateResponse{ID: "", Warnings: warnings}, daemon.imageNotExistToErrcode(err) + return types.ContainerCreateResponse{Warnings: warnings}, daemon.imageNotExistToErrcode(err) } return types.ContainerCreateResponse{ID: container.ID, Warnings: warnings}, nil } // Create creates a new container from the given configuration with a given name. -func (daemon *Daemon) create(params *ContainerCreateConfig) (retC *container.Container, retErr error) { +func (daemon *Daemon) create(params types.ContainerCreateConfig) (*container.Container, error) { var ( container *container.Container img *image.Image imgID image.ID err error + retErr error ) if params.Config.Image != "" { diff --git a/daemon/daemonbuilder/builder.go b/daemon/daemonbuilder/builder.go index f692e752c7..ab4122994b 100644 --- a/daemon/daemonbuilder/builder.go +++ b/daemon/daemonbuilder/builder.go @@ -36,7 +36,7 @@ type Docker struct { var _ builder.Backend = Docker{} // Pull tells Docker to pull image referenced by `name`. -func (d Docker) Pull(name string) (*image.Image, error) { +func (d Docker) Pull(name string) (builder.Image, error) { ref, err := reference.ParseNamed(name) if err != nil { return nil, err @@ -61,8 +61,16 @@ func (d Docker) Pull(name string) (*image.Image, error) { if err := d.Daemon.PullImage(ref, nil, pullRegistryAuth, ioutils.NopWriteCloser(d.OutOld)); err != nil { return nil, err } + return d.GetImage(name) +} - return d.Daemon.GetImage(name) +// GetImage looks up a Docker image referenced by `name`. +func (d Docker) GetImage(name string) (builder.Image, error) { + img, err := d.Daemon.GetImage(name) + if err != nil { + return nil, err + } + return imgWrap{img}, nil } // ContainerUpdateCmd updates Path and Args for the container with ID cID. @@ -76,16 +84,14 @@ func (d Docker) ContainerUpdateCmd(cID string, cmd []string) error { return nil } -// Retain retains an image avoiding it to be removed or overwritten until a corresponding Release() call. -func (d Docker) Retain(sessionID, imgID string) { - // FIXME: This will be solved with tags in client-side builder - //d.Daemon.Graph().Retain(sessionID, imgID) -} - -// Release releases a list of images that were retained for the time of a build. -func (d Docker) Release(sessionID string, activeImages []string) { - // FIXME: This will be solved with tags in client-side builder - //d.Daemon.Graph().Release(sessionID, activeImages...) +// ContainerAttach attaches streams to the container cID. If stream is true, it streams the output. +func (d Docker) ContainerAttach(cID string, stdin io.ReadCloser, stdout, stderr io.Writer, stream bool) error { + return d.Daemon.ContainerWsAttachWithLogs(cID, &daemon.ContainerWsAttachWithLogsConfig{ + InStream: stdin, + OutStream: stdout, + ErrStream: stderr, + Stream: stream, + }) } // BuilderCopy copies/extracts a source FileInfo to a destination path inside a container diff --git a/daemon/daemonbuilder/image.go b/daemon/daemonbuilder/image.go new file mode 100644 index 0000000000..ab5ab9a322 --- /dev/null +++ b/daemon/daemonbuilder/image.go @@ -0,0 +1,18 @@ +package daemonbuilder + +import ( + "github.com/docker/docker/image" + "github.com/docker/docker/runconfig" +) + +type imgWrap struct { + inner *image.Image +} + +func (img imgWrap) ID() string { + return string(img.inner.ID()) +} + +func (img imgWrap) Config() *runconfig.Config { + return img.inner.Config +}