From 9be1ec60d4d4fe63d5ef6e1ec36c585b548a00d0 Mon Sep 17 00:00:00 2001 From: Tibor Vass Date: Wed, 16 Dec 2015 17:01:36 +0100 Subject: [PATCH 1/3] builder: remove dependency on image Signed-off-by: Tibor Vass --- builder/builder.go | 5 ++--- builder/dockerfile/dispatchers.go | 4 ++-- builder/dockerfile/internals.go | 7 +++---- builder/image.go | 9 +++++++++ daemon/daemonbuilder/builder.go | 24 ++++++++++-------------- daemon/daemonbuilder/image.go | 18 ++++++++++++++++++ 6 files changed, 44 insertions(+), 23 deletions(-) create mode 100644 builder/image.go create mode 100644 daemon/daemonbuilder/image.go diff --git a/builder/builder.go b/builder/builder.go index caff35aead..06b151911a 100644 --- a/builder/builder.go +++ b/builder/builder.go @@ -11,7 +11,6 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/daemon" - "github.com/docker/docker/image" "github.com/docker/docker/runconfig" ) @@ -112,9 +111,9 @@ 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) + Pull(name string) (Image, error) // ContainerWsAttachWithLogs attaches to container. ContainerWsAttachWithLogs(name string, cfg *daemon.ContainerWsAttachWithLogsConfig) error // ContainerCreate creates a new Docker container and returns potential warnings diff --git a/builder/dockerfile/dispatchers.go b/builder/dockerfile/dispatchers.go index 97f50bb4e9..693bd8684c 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 0d87c12b04..1f82879244 100644 --- a/builder/dockerfile/internals.go +++ b/builder/dockerfile/internals.go @@ -24,7 +24,6 @@ import ( "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" @@ -403,11 +402,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) 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/daemonbuilder/builder.go b/daemon/daemonbuilder/builder.go index 6da9896301..d50cd7255e 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 @@ -69,8 +69,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. @@ -84,18 +92,6 @@ 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...) -} - // BuilderCopy copies/extracts a source FileInfo to a destination path inside a container // specified by a container object. // TODO: make sure callers don't unnecessarily convert destPath with filepath.FromSlash (Copy does it already). 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 +} From 03a170c48d660be72c387f1821ca48a713dd1cea Mon Sep 17 00:00:00 2001 From: Tibor Vass Date: Wed, 16 Dec 2015 17:56:49 +0100 Subject: [PATCH 2/3] builder: remove daemon dependency in ContainerCreate() Signed-off-by: Tibor Vass --- api/server/router/container/backend.go | 2 +- .../router/container/container_routes.go | 2 +- api/types/configs.go | 8 +++++++ builder/builder.go | 3 +-- builder/dockerfile/internals.go | 5 ++--- daemon/create.go | 21 +++++++------------ 6 files changed, 20 insertions(+), 21 deletions(-) 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 dd300a498f..b300a56b89 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 06b151911a..03090dabc3 100644 --- a/builder/builder.go +++ b/builder/builder.go @@ -10,7 +10,6 @@ import ( "time" "github.com/docker/docker/api/types" - "github.com/docker/docker/daemon" "github.com/docker/docker/runconfig" ) @@ -117,7 +116,7 @@ type Backend interface { // ContainerWsAttachWithLogs attaches to container. ContainerWsAttachWithLogs(name string, cfg *daemon.ContainerWsAttachWithLogsConfig) 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/internals.go b/builder/dockerfile/internals.go index 1f82879244..daa1f2903f 100644 --- a/builder/dockerfile/internals.go +++ b/builder/dockerfile/internals.go @@ -23,7 +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/pkg/archive" "github.com/docker/docker/pkg/httputils" "github.com/docker/docker/pkg/ioutils" @@ -188,7 +187,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 } @@ -507,7 +506,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, }) diff --git a/daemon/create.go b/daemon/create.go index ff6bca7f3d..1d8219dc8d 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 != "" { From b0d947615335fe115b5b93c0c09912a4888e5b29 Mon Sep 17 00:00:00 2001 From: Tibor Vass Date: Wed, 16 Dec 2015 19:19:12 +0100 Subject: [PATCH 3/3] builder: remove daemon dependency in ContainerAttach Signed-off-by: Tibor Vass --- builder/builder.go | 4 ++-- builder/dockerfile/internals.go | 6 +----- daemon/daemonbuilder/builder.go | 10 ++++++++++ 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/builder/builder.go b/builder/builder.go index 03090dabc3..5f2d5ded2f 100644 --- a/builder/builder.go +++ b/builder/builder.go @@ -113,8 +113,8 @@ type Backend interface { GetImage(name string) (Image, error) // Pull tells Docker to pull image referenced by `name`. Pull(name string) (Image, error) - // ContainerWsAttachWithLogs attaches to container. - ContainerWsAttachWithLogs(name string, cfg *daemon.ContainerWsAttachWithLogsConfig) 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(types.ContainerCreateConfig) (types.ContainerCreateResponse, error) // ContainerRm removes a container specified by `id`. diff --git a/builder/dockerfile/internals.go b/builder/dockerfile/internals.go index daa1f2903f..77d500eff2 100644 --- a/builder/dockerfile/internals.go +++ b/builder/dockerfile/internals.go @@ -534,11 +534,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/daemon/daemonbuilder/builder.go b/daemon/daemonbuilder/builder.go index d50cd7255e..1d6953721a 100644 --- a/daemon/daemonbuilder/builder.go +++ b/daemon/daemonbuilder/builder.go @@ -92,6 +92,16 @@ func (d Docker) ContainerUpdateCmd(cID string, cmd []string) error { return nil } +// 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 // specified by a container object. // TODO: make sure callers don't unnecessarily convert destPath with filepath.FromSlash (Copy does it already).