From 9d53ed8f63de35ec3b1d2d38cdf2bf496cc457f6 Mon Sep 17 00:00:00 2001 From: Laura Brehm Date: Thu, 26 Jan 2023 12:47:09 +0100 Subject: [PATCH 1/2] Add `--scale` to `compose create`, refactor scale option Signed-off-by: Laura Brehm --- cmd/compose/create.go | 26 ++++++++++++++++++++++++-- cmd/compose/run.go | 5 ++++- cmd/compose/up.go | 28 ++++++---------------------- cmd/compose/up_test.go | 4 ++-- 4 files changed, 36 insertions(+), 27 deletions(-) diff --git a/cmd/compose/create.go b/cmd/compose/create.go index 60c769fa5c9..b513c6d93b5 100644 --- a/cmd/compose/create.go +++ b/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 } diff --git a/cmd/compose/run.go b/cmd/compose/run.go index 259905f196a..a18daafd4b8 100644 --- a/cmd/compose/run.go +++ b/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) diff --git a/cmd/compose/up.go b/cmd/compose/up.go index f4bba1cc83a..29529a0c297 100644 --- a/cmd/compose/up.go +++ b/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 } diff --git a/cmd/compose/up_test.go b/cmd/compose/up_test.go index dd8f9de412d..ab1858e9fd5 100644 --- a/cmd/compose/up_test.go +++ b/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) From a288332fbd153bb46f72d609a79d24092858bcac Mon Sep 17 00:00:00 2001 From: Laura Brehm Date: Thu, 26 Jan 2023 13:03:49 +0100 Subject: [PATCH 2/2] Update docs to add `--scale` argument to `compose create` Signed-off-by: Laura Brehm --- docs/reference/compose_create.md | 17 +++++++++-------- docs/reference/docker_compose_create.yaml | 11 +++++++++++ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/docs/reference/compose_create.md b/docs/reference/compose_create.md index 654e1943dfa..ef968330df8 100644 --- a/docs/reference/compose_create.md +++ b/docs/reference/compose_create.md @@ -5,14 +5,15 @@ Creates containers for a service. ### Options -| Name | Type | Default | Description | -|:-------------------|:---------|:----------|:--------------------------------------------------------------------------------------| -| `--build` | | | Build images before starting containers. | -| `--force-recreate` | | | Recreate containers even if their configuration and image haven't changed. | -| `--no-build` | | | Don't build an image, even if it's missing. | -| `--no-recreate` | | | If containers already exist, don't recreate them. Incompatible with --force-recreate. | -| `--pull` | `string` | `missing` | Pull image before running ("always"\|"missing"\|"never") | -| `--remove-orphans` | | | Remove containers for services not defined in the Compose file. | +| Name | Type | Default | Description | +|:-------------------|:--------------|:----------|:----------------------------------------------------------------------------------------------| +| `--build` | | | Build images before starting containers. | +| `--force-recreate` | | | Recreate containers even if their configuration and image haven't changed. | +| `--no-build` | | | Don't build an image, even if it's missing. | +| `--no-recreate` | | | If containers already exist, don't recreate them. Incompatible with --force-recreate. | +| `--pull` | `string` | `missing` | Pull image before running ("always"\|"missing"\|"never") | +| `--remove-orphans` | | | Remove containers for services not defined in the Compose file. | +| `--scale` | `stringArray` | | Scale SERVICE to NUM instances. Overrides the `scale` setting in the Compose file if present. | diff --git a/docs/reference/docker_compose_create.yaml b/docs/reference/docker_compose_create.yaml index 5c4318e847c..1dfa25e3767 100644 --- a/docs/reference/docker_compose_create.yaml +++ b/docs/reference/docker_compose_create.yaml @@ -67,6 +67,17 @@ options: experimentalcli: false kubernetes: false swarm: false + - option: scale + value_type: stringArray + default_value: '[]' + description: | + Scale SERVICE to NUM instances. Overrides the `scale` setting in the Compose file if present. + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false deprecated: false experimental: false experimentalcli: false