Browse code

Merge pull request #18721 from tiborvass/remove-dependencies-from-builder

Remove image and daemon dependencies from builder

Vincent Demeester authored on 2015/12/19 01:19:55
Showing 10 changed files
... ...
@@ -32,7 +32,7 @@ type copyBackend interface {
32 32
 
33 33
 // stateBackend includes functions to implement to provide container state lifecycle functionality.
34 34
 type stateBackend interface {
35
-	ContainerCreate(params *daemon.ContainerCreateConfig) (types.ContainerCreateResponse, error)
35
+	ContainerCreate(types.ContainerCreateConfig) (types.ContainerCreateResponse, error)
36 36
 	ContainerKill(name string, sig uint64) error
37 37
 	ContainerPause(name string) error
38 38
 	ContainerRename(oldName, newName string) error
... ...
@@ -339,7 +339,7 @@ func (s *containerRouter) postContainersCreate(ctx context.Context, w http.Respo
339 339
 	version := httputils.VersionFromContext(ctx)
340 340
 	adjustCPUShares := version.LessThan("1.19")
341 341
 
342
-	ccr, err := s.backend.ContainerCreate(&daemon.ContainerCreateConfig{
342
+	ccr, err := s.backend.ContainerCreate(types.ContainerCreateConfig{
343 343
 		Name:            name,
344 344
 		Config:          config,
345 345
 		HostConfig:      hostConfig,
... ...
@@ -8,6 +8,14 @@ import (
8 8
 	"github.com/docker/docker/runconfig"
9 9
 )
10 10
 
11
+// ContainerCreateConfig is the parameter set to ContainerCreate()
12
+type ContainerCreateConfig struct {
13
+	Name            string
14
+	Config          *runconfig.Config
15
+	HostConfig      *runconfig.HostConfig
16
+	AdjustCPUShares bool
17
+}
18
+
11 19
 // ContainerRmConfig holds arguments for the container remove
12 20
 // operation. This struct is used to tell the backend what operations
13 21
 // to perform.
... ...
@@ -10,8 +10,6 @@ import (
10 10
 	"time"
11 11
 
12 12
 	"github.com/docker/docker/api/types"
13
-	"github.com/docker/docker/daemon"
14
-	"github.com/docker/docker/image"
15 13
 	"github.com/docker/docker/runconfig"
16 14
 )
17 15
 
... ...
@@ -112,13 +110,13 @@ type Backend interface {
112 112
 	// TODO: use digest reference instead of name
113 113
 
114 114
 	// GetImage looks up a Docker image referenced by `name`.
115
-	GetImage(name string) (*image.Image, error)
115
+	GetImage(name string) (Image, error)
116 116
 	// Pull tells Docker to pull image referenced by `name`.
117
-	Pull(name string) (*image.Image, error)
118
-	// ContainerWsAttachWithLogs attaches to container.
119
-	ContainerWsAttachWithLogs(name string, cfg *daemon.ContainerWsAttachWithLogsConfig) error
117
+	Pull(name string) (Image, error)
118
+	// ContainerAttach attaches to container.
119
+	ContainerAttach(cID string, stdin io.ReadCloser, stdout, stderr io.Writer, stream bool) error
120 120
 	// ContainerCreate creates a new Docker container and returns potential warnings
121
-	ContainerCreate(params *daemon.ContainerCreateConfig) (types.ContainerCreateResponse, error)
121
+	ContainerCreate(types.ContainerCreateConfig) (types.ContainerCreateResponse, error)
122 122
 	// ContainerRm removes a container specified by `id`.
123 123
 	ContainerRm(name string, config *types.ContainerRmConfig) error
124 124
 	// Commit creates a new Docker image from an existing Docker container.
... ...
@@ -18,8 +18,8 @@ import (
18 18
 	"strings"
19 19
 
20 20
 	"github.com/Sirupsen/logrus"
21
+	"github.com/docker/docker/builder"
21 22
 	derr "github.com/docker/docker/errors"
22
-	"github.com/docker/docker/image"
23 23
 	flag "github.com/docker/docker/pkg/mflag"
24 24
 	"github.com/docker/docker/pkg/nat"
25 25
 	"github.com/docker/docker/pkg/signal"
... ...
@@ -210,7 +210,7 @@ func from(b *Builder, args []string, attributes map[string]bool, original string
210 210
 	}
211 211
 
212 212
 	var (
213
-		image *image.Image
213
+		image builder.Image
214 214
 		err   error
215 215
 	)
216 216
 	// TODO: don't use `name`, instead resolve it to a digest
... ...
@@ -23,8 +23,6 @@ import (
23 23
 	"github.com/docker/docker/api/types"
24 24
 	"github.com/docker/docker/builder"
25 25
 	"github.com/docker/docker/builder/dockerfile/parser"
26
-	"github.com/docker/docker/daemon"
27
-	"github.com/docker/docker/image"
28 26
 	"github.com/docker/docker/pkg/archive"
29 27
 	"github.com/docker/docker/pkg/httputils"
30 28
 	"github.com/docker/docker/pkg/ioutils"
... ...
@@ -185,7 +183,7 @@ func (b *Builder) runContextCommand(args []string, allowRemote bool, allowLocalD
185 185
 		return nil
186 186
 	}
187 187
 
188
-	container, err := b.docker.ContainerCreate(&daemon.ContainerCreateConfig{Config: b.runConfig})
188
+	container, err := b.docker.ContainerCreate(types.ContainerCreateConfig{Config: b.runConfig})
189 189
 	if err != nil {
190 190
 		return err
191 191
 	}
... ...
@@ -395,11 +393,11 @@ func containsWildcards(name string) bool {
395 395
 	return false
396 396
 }
397 397
 
398
-func (b *Builder) processImageFrom(img *image.Image) error {
399
-	b.image = img.ID().String()
398
+func (b *Builder) processImageFrom(img builder.Image) error {
399
+	b.image = img.ID()
400 400
 
401 401
 	if img.Config != nil {
402
-		b.runConfig = img.Config
402
+		b.runConfig = img.Config()
403 403
 	}
404 404
 
405 405
 	// The default path will be blank on Windows (set by HCS)
... ...
@@ -500,7 +498,7 @@ func (b *Builder) create() (string, error) {
500 500
 	config := *b.runConfig
501 501
 
502 502
 	// Create the container
503
-	c, err := b.docker.ContainerCreate(&daemon.ContainerCreateConfig{
503
+	c, err := b.docker.ContainerCreate(types.ContainerCreateConfig{
504 504
 		Config:     b.runConfig,
505 505
 		HostConfig: hostConfig,
506 506
 	})
... ...
@@ -528,11 +526,7 @@ func (b *Builder) run(cID string) (err error) {
528 528
 	errCh := make(chan error)
529 529
 	if b.Verbose {
530 530
 		go func() {
531
-			errCh <- b.docker.ContainerWsAttachWithLogs(cID, &daemon.ContainerWsAttachWithLogsConfig{
532
-				OutStream: b.Stdout,
533
-				ErrStream: b.Stderr,
534
-				Stream:    true,
535
-			})
531
+			errCh <- b.docker.ContainerAttach(cID, nil, b.Stdout, b.Stderr, true)
536 532
 		}()
537 533
 	}
538 534
 
539 535
new file mode 100644
... ...
@@ -0,0 +1,9 @@
0
+package builder
1
+
2
+import "github.com/docker/docker/runconfig"
3
+
4
+// Image represents a Docker image used by the builder.
5
+type Image interface {
6
+	ID() string
7
+	Config() *runconfig.Config
8
+}
... ...
@@ -13,23 +13,15 @@ import (
13 13
 	"github.com/opencontainers/runc/libcontainer/label"
14 14
 )
15 15
 
16
-// ContainerCreateConfig is the parameter set to ContainerCreate()
17
-type ContainerCreateConfig struct {
18
-	Name            string
19
-	Config          *runconfig.Config
20
-	HostConfig      *runconfig.HostConfig
21
-	AdjustCPUShares bool
22
-}
23
-
24
-// ContainerCreate takes configs and creates a container.
25
-func (daemon *Daemon) ContainerCreate(params *ContainerCreateConfig) (types.ContainerCreateResponse, error) {
16
+// ContainerCreate creates a container.
17
+func (daemon *Daemon) ContainerCreate(params types.ContainerCreateConfig) (types.ContainerCreateResponse, error) {
26 18
 	if params.Config == nil {
27 19
 		return types.ContainerCreateResponse{}, derr.ErrorCodeEmptyConfig
28 20
 	}
29 21
 
30 22
 	warnings, err := daemon.verifyContainerSettings(params.HostConfig, params.Config)
31 23
 	if err != nil {
32
-		return types.ContainerCreateResponse{ID: "", Warnings: warnings}, err
24
+		return types.ContainerCreateResponse{Warnings: warnings}, err
33 25
 	}
34 26
 
35 27
 	if params.HostConfig == nil {
... ...
@@ -37,24 +29,25 @@ func (daemon *Daemon) ContainerCreate(params *ContainerCreateConfig) (types.Cont
37 37
 	}
38 38
 	err = daemon.adaptContainerSettings(params.HostConfig, params.AdjustCPUShares)
39 39
 	if err != nil {
40
-		return types.ContainerCreateResponse{ID: "", Warnings: warnings}, err
40
+		return types.ContainerCreateResponse{Warnings: warnings}, err
41 41
 	}
42 42
 
43 43
 	container, err := daemon.create(params)
44 44
 	if err != nil {
45
-		return types.ContainerCreateResponse{ID: "", Warnings: warnings}, daemon.imageNotExistToErrcode(err)
45
+		return types.ContainerCreateResponse{Warnings: warnings}, daemon.imageNotExistToErrcode(err)
46 46
 	}
47 47
 
48 48
 	return types.ContainerCreateResponse{ID: container.ID, Warnings: warnings}, nil
49 49
 }
50 50
 
51 51
 // Create creates a new container from the given configuration with a given name.
52
-func (daemon *Daemon) create(params *ContainerCreateConfig) (retC *container.Container, retErr error) {
52
+func (daemon *Daemon) create(params types.ContainerCreateConfig) (*container.Container, error) {
53 53
 	var (
54 54
 		container *container.Container
55 55
 		img       *image.Image
56 56
 		imgID     image.ID
57 57
 		err       error
58
+		retErr    error
58 59
 	)
59 60
 
60 61
 	if params.Config.Image != "" {
... ...
@@ -36,7 +36,7 @@ type Docker struct {
36 36
 var _ builder.Backend = Docker{}
37 37
 
38 38
 // Pull tells Docker to pull image referenced by `name`.
39
-func (d Docker) Pull(name string) (*image.Image, error) {
39
+func (d Docker) Pull(name string) (builder.Image, error) {
40 40
 	ref, err := reference.ParseNamed(name)
41 41
 	if err != nil {
42 42
 		return nil, err
... ...
@@ -61,8 +61,16 @@ func (d Docker) Pull(name string) (*image.Image, error) {
61 61
 	if err := d.Daemon.PullImage(ref, nil, pullRegistryAuth, ioutils.NopWriteCloser(d.OutOld)); err != nil {
62 62
 		return nil, err
63 63
 	}
64
+	return d.GetImage(name)
65
+}
64 66
 
65
-	return d.Daemon.GetImage(name)
67
+// GetImage looks up a Docker image referenced by `name`.
68
+func (d Docker) GetImage(name string) (builder.Image, error) {
69
+	img, err := d.Daemon.GetImage(name)
70
+	if err != nil {
71
+		return nil, err
72
+	}
73
+	return imgWrap{img}, nil
66 74
 }
67 75
 
68 76
 // ContainerUpdateCmd updates Path and Args for the container with ID cID.
... ...
@@ -76,16 +84,14 @@ func (d Docker) ContainerUpdateCmd(cID string, cmd []string) error {
76 76
 	return nil
77 77
 }
78 78
 
79
-// Retain retains an image avoiding it to be removed or overwritten until a corresponding Release() call.
80
-func (d Docker) Retain(sessionID, imgID string) {
81
-	// FIXME: This will be solved with tags in client-side builder
82
-	//d.Daemon.Graph().Retain(sessionID, imgID)
83
-}
84
-
85
-// Release releases a list of images that were retained for the time of a build.
86
-func (d Docker) Release(sessionID string, activeImages []string) {
87
-	// FIXME: This will be solved with tags in client-side builder
88
-	//d.Daemon.Graph().Release(sessionID, activeImages...)
79
+// ContainerAttach attaches streams to the container cID. If stream is true, it streams the output.
80
+func (d Docker) ContainerAttach(cID string, stdin io.ReadCloser, stdout, stderr io.Writer, stream bool) error {
81
+	return d.Daemon.ContainerWsAttachWithLogs(cID, &daemon.ContainerWsAttachWithLogsConfig{
82
+		InStream:  stdin,
83
+		OutStream: stdout,
84
+		ErrStream: stderr,
85
+		Stream:    stream,
86
+	})
89 87
 }
90 88
 
91 89
 // BuilderCopy copies/extracts a source FileInfo to a destination path inside a container
92 90
new file mode 100644
... ...
@@ -0,0 +1,18 @@
0
+package daemonbuilder
1
+
2
+import (
3
+	"github.com/docker/docker/image"
4
+	"github.com/docker/docker/runconfig"
5
+)
6
+
7
+type imgWrap struct {
8
+	inner *image.Image
9
+}
10
+
11
+func (img imgWrap) ID() string {
12
+	return string(img.inner.ID())
13
+}
14
+
15
+func (img imgWrap) Config() *runconfig.Config {
16
+	return img.inner.Config
17
+}