diff --git a/cli/command/service/scale.go b/cli/command/service/scale.go index 397fe1800c..7a23a26626 100644 --- a/cli/command/service/scale.go +++ b/cli/command/service/scale.go @@ -12,17 +12,28 @@ import ( "github.com/docker/docker/api/types" "github.com/pkg/errors" "github.com/spf13/cobra" + "github.com/spf13/pflag" ) +type scaleOptions struct { + detach bool +} + func newScaleCommand(dockerCli *command.DockerCli) *cobra.Command { - return &cobra.Command{ + options := &scaleOptions{} + + cmd := &cobra.Command{ Use: "scale SERVICE=REPLICAS [SERVICE=REPLICAS...]", Short: "Scale one or multiple replicated services", Args: scaleArgs, RunE: func(cmd *cobra.Command, args []string) error { - return runScale(dockerCli, args) + return runScale(dockerCli, cmd.Flags(), options, args) }, } + + flags := cmd.Flags() + addDetachFlag(flags, &options.detach) + return cmd } func scaleArgs(cmd *cobra.Command, args []string) error { @@ -43,8 +54,10 @@ func scaleArgs(cmd *cobra.Command, args []string) error { return nil } -func runScale(dockerCli *command.DockerCli, args []string) error { +func runScale(dockerCli *command.DockerCli, flags *pflag.FlagSet, options *scaleOptions, args []string) error { var errs []string + ctx := context.Background() + for _, arg := range args { parts := strings.SplitN(arg, "=", 2) serviceID, scaleStr := parts[0], parts[1] @@ -56,9 +69,21 @@ func runScale(dockerCli *command.DockerCli, args []string) error { continue } - if err := runServiceScale(dockerCli, serviceID, scale); err != nil { + if err := runServiceScale(ctx, dockerCli, serviceID, scale); err != nil { errs = append(errs, fmt.Sprintf("%s: %v", serviceID, err)) } + + if options.detach { + continue + } + + if err := waitOnService(ctx, dockerCli, serviceID, false); err != nil { + errs = append(errs, fmt.Sprintf("%s: %v", serviceID, err)) + } + } + + if options.detach { + warnDetachDefault(dockerCli.Err(), dockerCli.Client().ClientVersion(), flags, "scaled") } if len(errs) == 0 { @@ -67,9 +92,8 @@ func runScale(dockerCli *command.DockerCli, args []string) error { return errors.Errorf(strings.Join(errs, "\n")) } -func runServiceScale(dockerCli *command.DockerCli, serviceID string, scale uint64) error { +func runServiceScale(ctx context.Context, dockerCli *command.DockerCli, serviceID string, scale uint64) error { client := dockerCli.Client() - ctx := context.Background() service, _, err := client.ServiceInspectWithRaw(ctx, serviceID, types.ServiceInspectOptions{}) if err != nil { diff --git a/docs/reference/commandline/service_scale.md b/docs/reference/commandline/service_scale.md index a3aef5fd34..47d49faa25 100644 --- a/docs/reference/commandline/service_scale.md +++ b/docs/reference/commandline/service_scale.md @@ -16,11 +16,12 @@ keywords: "service, scale" # service scale ```markdown -Usage: docker service scale SERVICE=REPLICAS [SERVICE=REPLICAS...] +Usage: docker service scale [OPTIONS] SERVICE=REPLICAS [SERVICE=REPLICAS...] Scale one or multiple replicated services Options: + -d, --detach Exit immediately instead of waiting for the service to converge (default true) --help Print usage ```