瀏覽代碼

Add `--scale` to `compose create`, refactor scale option

Signed-off-by: Laura Brehm <[email protected]>
Laura Brehm 2 年之前
父節點
當前提交
9d53ed8f63
共有 4 個文件被更改,包括 36 次插入27 次删除
  1. 24 2
      cmd/compose/create.go
  2. 4 1
      cmd/compose/run.go
  3. 6 22
      cmd/compose/up.go
  4. 2 2
      cmd/compose/up_test.go

+ 24 - 2
cmd/compose/create.go

@@ -19,6 +19,8 @@ package compose
 import (
 	"context"
 	"fmt"
+	"strconv"
+	"strings"
 	"time"
 
 	"github.com/compose-spec/compose-go/types"
@@ -41,6 +43,7 @@ type createOptions struct {
 	timeChanged   bool
 	timeout       int
 	quietPull     bool
+	scale         []string
 }
 
 func createCommand(p *ProjectOptions, backend api.Service) *cobra.Command {
@@ -59,7 +62,9 @@ func createCommand(p *ProjectOptions, backend api.Service) *cobra.Command {
 			return nil
 		}),
 		RunE: p.WithProject(func(ctx context.Context, project *types.Project) error {
-			opts.Apply(project)
+			if err := opts.Apply(project); err != nil {
+				return err
+			}
 			return backend.Create(ctx, project, api.CreateOptions{
 				RemoveOrphans:        opts.removeOrphans,
 				IgnoreOrphans:        opts.ignoreOrphans,
@@ -79,6 +84,7 @@ func createCommand(p *ProjectOptions, backend api.Service) *cobra.Command {
 	flags.BoolVar(&opts.forceRecreate, "force-recreate", false, "Recreate containers even if their configuration and image haven't changed.")
 	flags.BoolVar(&opts.noRecreate, "no-recreate", false, "If containers already exist, don't recreate them. Incompatible with --force-recreate.")
 	flags.BoolVar(&opts.removeOrphans, "remove-orphans", false, "Remove containers for services not defined in the Compose file.")
+	flags.StringArrayVar(&opts.scale, "scale", []string{}, "Scale SERVICE to NUM instances. Overrides the `scale` setting in the Compose file if present.")
 	return cmd
 }
 
@@ -110,7 +116,7 @@ func (opts createOptions) GetTimeout() *time.Duration {
 	return nil
 }
 
-func (opts createOptions) Apply(project *types.Project) {
+func (opts createOptions) Apply(project *types.Project) error {
 	if opts.pullChanged {
 		for i, service := range project.Services {
 			service.PullPolicy = opts.Pull
@@ -135,4 +141,20 @@ func (opts createOptions) Apply(project *types.Project) {
 			project.Services[i] = service
 		}
 	}
+	for _, scale := range opts.scale {
+		split := strings.Split(scale, "=")
+		if len(split) != 2 {
+			return fmt.Errorf("invalid --scale option %q. Should be SERVICE=NUM", scale)
+		}
+		name := split[0]
+		replicas, err := strconv.Atoi(split[1])
+		if err != nil {
+			return err
+		}
+		err = setServiceScale(project, name, uint64(replicas))
+		if err != nil {
+			return err
+		}
+	}
+	return nil
 }

+ 4 - 1
cmd/compose/run.go

@@ -197,7 +197,10 @@ func runRun(ctx context.Context, backend api.Service, project *types.Project, op
 		return err
 	}
 
-	createOpts.Apply(project)
+	err = createOpts.Apply(project)
+	if err != nil {
+		return err
+	}
 
 	err = progress.Run(ctx, func(ctx context.Context) error {
 		return startDependencies(ctx, backend, *project, opts.Service, opts.ignoreOrphans)

+ 6 - 22
cmd/compose/up.go

@@ -19,8 +19,6 @@ package compose
 import (
 	"context"
 	"fmt"
-	"strconv"
-	"strings"
 
 	"github.com/docker/compose/v2/cmd/formatter"
 
@@ -43,7 +41,6 @@ type upOptions struct {
 	noDeps             bool
 	cascadeStop        bool
 	exitCodeFrom       string
-	scale              []string
 	noColor            bool
 	noPrefix           bool
 	attachDependencies bool
@@ -68,22 +65,6 @@ func (opts upOptions) apply(project *types.Project, services []string) error {
 		}
 	}
 
-	for _, scale := range opts.scale {
-		split := strings.Split(scale, "=")
-		if len(split) != 2 {
-			return fmt.Errorf("invalid --scale option %q. Should be SERVICE=NUM", scale)
-		}
-		name := split[0]
-		replicas, err := strconv.Atoi(split[1])
-		if err != nil {
-			return err
-		}
-		err = setServiceScale(project, name, uint64(replicas))
-		if err != nil {
-			return err
-		}
-	}
-
 	return nil
 }
 
@@ -113,7 +94,7 @@ func upCommand(p *ProjectOptions, streams api.Streams, backend api.Service) *cob
 	flags.BoolVar(&create.noBuild, "no-build", false, "Don't build an image, even if it's missing.")
 	flags.StringVar(&create.Pull, "pull", "missing", `Pull image before running ("always"|"missing"|"never")`)
 	flags.BoolVar(&create.removeOrphans, "remove-orphans", false, "Remove containers for services not defined in the Compose file.")
-	flags.StringArrayVar(&up.scale, "scale", []string{}, "Scale SERVICE to NUM instances. Overrides the `scale` setting in the Compose file if present.")
+	flags.StringArrayVar(&create.scale, "scale", []string{}, "Scale SERVICE to NUM instances. Overrides the `scale` setting in the Compose file if present.")
 	flags.BoolVar(&up.noColor, "no-color", false, "Produce monochrome output.")
 	flags.BoolVar(&up.noPrefix, "no-log-prefix", false, "Don't print prefix in logs.")
 	flags.BoolVar(&create.forceRecreate, "force-recreate", false, "Recreate containers even if their configuration and image haven't changed.")
@@ -165,9 +146,12 @@ func runUp(ctx context.Context, streams api.Streams, backend api.Service, create
 		return fmt.Errorf("no service selected")
 	}
 
-	createOptions.Apply(project)
+	err := createOptions.Apply(project)
+	if err != nil {
+		return err
+	}
 
-	err := upOptions.apply(project, services)
+	err = upOptions.apply(project, services)
 	if err != nil {
 		return err
 	}

+ 2 - 2
cmd/compose/up_test.go

@@ -34,8 +34,8 @@ func TestApplyScaleOpt(t *testing.T) {
 			},
 		},
 	}
-	opt := upOptions{scale: []string{"foo=2"}}
-	err := opt.apply(&p, nil)
+	opt := createOptions{scale: []string{"foo=2"}}
+	err := opt.Apply(&p)
 	assert.NilError(t, err)
 	foo, err := p.GetService("foo")
 	assert.NilError(t, err)