Преглед изворни кода

Merge pull request #1378 from docker/build_pull

support compose build --pull
Nicolas De loof пре 4 година
родитељ
комит
03bce03028
8 измењених фајлова са 35 додато и 15 уклоњено
  1. 1 1
      aci/compose.go
  2. 1 1
      api/client/compose.go
  3. 9 1
      api/compose/api.go
  4. 10 2
      cli/cmd/compose/build.go
  5. 2 2
      ecs/local/compose.go
  6. 1 1
      ecs/up.go
  7. 1 1
      kube/compose.go
  8. 10 6
      local/compose/build.go

+ 1 - 1
aci/compose.go

@@ -44,7 +44,7 @@ func newComposeService(ctx store.AciContext) aciComposeService {
 	}
 }
 
-func (cs *aciComposeService) Build(ctx context.Context, project *types.Project) error {
+func (cs *aciComposeService) Build(ctx context.Context, project *types.Project, options compose.BuildOptions) error {
 	return errdefs.ErrNotImplemented
 }
 

+ 1 - 1
api/client/compose.go

@@ -28,7 +28,7 @@ import (
 type composeService struct {
 }
 
-func (c *composeService) Build(ctx context.Context, project *types.Project) error {
+func (c *composeService) Build(ctx context.Context, project *types.Project, options compose.BuildOptions) error {
 	return errdefs.ErrNotImplemented
 }
 

+ 9 - 1
api/compose/api.go

@@ -28,7 +28,7 @@ import (
 // Service manages a compose project
 type Service interface {
 	// Build executes the equivalent to a `compose build`
-	Build(ctx context.Context, project *types.Project) error
+	Build(ctx context.Context, project *types.Project, options BuildOptions) error
 	// Push executes the equivalent ot a `compose push`
 	Push(ctx context.Context, project *types.Project) error
 	// Pull executes the equivalent of a `compose pull`
@@ -65,6 +65,14 @@ type Service interface {
 	UnPause(ctx context.Context, project *types.Project) error
 }
 
+// BuildOptions group options of the Build API
+type BuildOptions struct {
+	// Pull always attempt to pull a newer version of the image
+	Pull bool
+	// Progress set type of progress output ("auto", "plain", "tty")
+	Progress string
+}
+
 // CreateOptions group options of the Create API
 type CreateOptions struct {
 	// Services defines the services user interacts with

+ 10 - 2
cli/cmd/compose/build.go

@@ -23,13 +23,16 @@ import (
 	"github.com/spf13/cobra"
 
 	"github.com/docker/compose-cli/api/client"
+	"github.com/docker/compose-cli/api/compose"
 	"github.com/docker/compose-cli/api/progress"
 )
 
 type buildOptions struct {
 	*projectOptions
 	composeOptions
-	quiet bool
+	quiet    bool
+	pull     bool
+	progress string
 }
 
 func buildCommand(p *projectOptions) *cobra.Command {
@@ -51,6 +54,8 @@ func buildCommand(p *projectOptions) *cobra.Command {
 		},
 	}
 	cmd.Flags().BoolVarP(&opts.quiet, "quiet", "q", false, "Don't print anything to STDOUT")
+	cmd.Flags().BoolVar(&opts.pull, "pull", false, "Always attempt to pull a newer version of the image.")
+	cmd.Flags().StringVar(&opts.progress, "progress", "auto", `Set type of progress output ("auto", "plain", "tty")`)
 	return cmd
 }
 
@@ -66,7 +71,10 @@ func runBuild(ctx context.Context, opts buildOptions, services []string) error {
 	}
 
 	_, err = progress.Run(ctx, func(ctx context.Context) (string, error) {
-		return "", c.ComposeService().Build(ctx, project)
+		return "", c.ComposeService().Build(ctx, project, compose.BuildOptions{
+			Pull:     opts.pull,
+			Progress: opts.progress,
+		})
 	})
 	return err
 }

+ 2 - 2
ecs/local/compose.go

@@ -32,8 +32,8 @@ import (
 	"github.com/docker/compose-cli/api/errdefs"
 )
 
-func (e ecsLocalSimulation) Build(ctx context.Context, project *types.Project) error {
-	return e.compose.Build(ctx, project)
+func (e ecsLocalSimulation) Build(ctx context.Context, project *types.Project, options compose.BuildOptions) error {
+	return e.compose.Build(ctx, project, options)
 }
 
 func (e ecsLocalSimulation) Push(ctx context.Context, project *types.Project) error {

+ 1 - 1
ecs/up.go

@@ -31,7 +31,7 @@ import (
 	"github.com/compose-spec/compose-go/types"
 )
 
-func (b *ecsAPIService) Build(ctx context.Context, project *types.Project) error {
+func (b *ecsAPIService) Build(ctx context.Context, project *types.Project, options compose.BuildOptions) error {
 	return errdefs.ErrNotImplemented
 }
 

+ 1 - 1
kube/compose.go

@@ -124,7 +124,7 @@ func (s *composeService) List(ctx context.Context, opts compose.ListOptions) ([]
 }
 
 // Build executes the equivalent to a `compose build`
-func (s *composeService) Build(ctx context.Context, project *types.Project) error {
+func (s *composeService) Build(ctx context.Context, project *types.Project, options compose.BuildOptions) error {
 	return errdefs.ErrNotImplemented
 }
 

+ 10 - 6
local/compose/build.go

@@ -23,6 +23,8 @@ import (
 	"path"
 	"strings"
 
+	"github.com/docker/compose-cli/api/compose"
+
 	"github.com/compose-spec/compose-go/types"
 	"github.com/docker/buildx/build"
 	"github.com/docker/buildx/driver"
@@ -32,18 +34,20 @@ import (
 	bclient "github.com/moby/buildkit/client"
 )
 
-func (s *composeService) Build(ctx context.Context, project *types.Project) error {
+func (s *composeService) Build(ctx context.Context, project *types.Project, options compose.BuildOptions) error {
 	opts := map[string]build.Options{}
 	imagesToBuild := []string{}
 	for _, service := range project.Services {
 		if service.Build != nil {
 			imageName := getImageName(service, project.Name)
 			imagesToBuild = append(imagesToBuild, imageName)
-			opts[imageName] = s.toBuildOptions(service, project.WorkingDir, imageName)
+			buildOptions := s.toBuildOptions(service, project.WorkingDir, imageName)
+			buildOptions.Pull = options.Pull
+			opts[imageName] = buildOptions
 		}
 	}
 
-	err := s.build(ctx, project, opts)
+	err := s.build(ctx, project, opts, options.Progress)
 	if err == nil {
 		displayScanSuggestMsg(ctx, imagesToBuild)
 	}
@@ -93,7 +97,7 @@ func (s *composeService) ensureImagesExists(ctx context.Context, project *types.
 
 	}
 
-	err := s.build(ctx, project, opts)
+	err := s.build(ctx, project, opts, "auto")
 	if err == nil {
 		displayScanSuggestMsg(ctx, imagesToBuild)
 	}
@@ -111,7 +115,7 @@ func (s *composeService) localImagePresent(ctx context.Context, imageName string
 	return true, nil
 }
 
-func (s *composeService) build(ctx context.Context, project *types.Project, opts map[string]build.Options) error {
+func (s *composeService) build(ctx context.Context, project *types.Project, opts map[string]build.Options, mode string) error {
 	if len(opts) == 0 {
 		return nil
 	}
@@ -132,7 +136,7 @@ func (s *composeService) build(ctx context.Context, project *types.Project, opts
 	// build and will lock
 	progressCtx, cancel := context.WithCancel(context.Background())
 	defer cancel()
-	w := progress.NewPrinter(progressCtx, os.Stdout, "auto")
+	w := progress.NewPrinter(progressCtx, os.Stdout, mode)
 
 	// We rely on buildx "docker" builder integrated in docker engine, so don't need a DockerAPI here
 	_, err = build.Build(ctx, driverInfo, opts, nil, nil, w)