Skip to content

Commit 7f668bd

Browse files
committed
Setup Compose service using functional parameters
This commit introduces WithMaxConcurrency and WithDryRun to replace direct mutators on composeService commands and flags are translated into a set of functional parameters which are eventually applied as a ComposeService is created just before being actually used by a command Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com>
1 parent 3ce5288 commit 7f668bd

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+378
-463
lines changed

cmd/compose/alpha.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
/*
2-
32
Copyright 2020 Docker Compose CLI authors
43
Licensed under the Apache License, Version 2.0 (the "License");
54
you may not use this file except in compliance with the License.
@@ -16,12 +15,11 @@ package compose
1615

1716
import (
1817
"github.com/docker/cli/cli/command"
19-
"github.com/docker/compose/v2/pkg/api"
2018
"github.com/spf13/cobra"
2119
)
2220

2321
// alphaCommand groups all experimental subcommands
24-
func alphaCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Compose) *cobra.Command {
22+
func alphaCommand(p *ProjectOptions, dockerCli command.Cli, backendOptions *BackendOptions) *cobra.Command {
2523
cmd := &cobra.Command{
2624
Short: "Experimental commands",
2725
Use: "alpha [COMMAND]",
@@ -31,9 +29,9 @@ func alphaCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Compose)
3129
},
3230
}
3331
cmd.AddCommand(
34-
vizCommand(p, dockerCli, backend),
35-
publishCommand(p, dockerCli, backend),
36-
generateCommand(p, backend),
32+
vizCommand(p, dockerCli, backendOptions),
33+
publishCommand(p, dockerCli, backendOptions),
34+
generateCommand(p, dockerCli, backendOptions),
3735
)
3836
return cmd
3937
}

cmd/compose/attach.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121

2222
"github.com/docker/cli/cli/command"
2323
"github.com/docker/compose/v2/pkg/api"
24+
"github.com/docker/compose/v2/pkg/compose"
2425
"github.com/spf13/cobra"
2526
)
2627

@@ -35,7 +36,7 @@ type attachOpts struct {
3536
proxy bool
3637
}
3738

38-
func attachCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Compose) *cobra.Command {
39+
func attachCommand(p *ProjectOptions, dockerCli command.Cli, backendOptions *BackendOptions) *cobra.Command {
3940
opts := attachOpts{
4041
composeOptions: &composeOptions{
4142
ProjectOptions: p,
@@ -50,7 +51,7 @@ func attachCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Compose
5051
return nil
5152
}),
5253
RunE: Adapt(func(ctx context.Context, args []string) error {
53-
return runAttach(ctx, dockerCli, backend, opts)
54+
return runAttach(ctx, dockerCli, backendOptions, opts)
5455
}),
5556
ValidArgsFunction: completeServiceNames(dockerCli, p),
5657
}
@@ -63,7 +64,7 @@ func attachCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Compose
6364
return runCmd
6465
}
6566

66-
func runAttach(ctx context.Context, dockerCli command.Cli, backend api.Compose, opts attachOpts) error {
67+
func runAttach(ctx context.Context, dockerCli command.Cli, backendOptions *BackendOptions, opts attachOpts) error {
6768
projectName, err := opts.toProjectName(ctx, dockerCli)
6869
if err != nil {
6970
return err
@@ -76,5 +77,9 @@ func runAttach(ctx context.Context, dockerCli command.Cli, backend api.Compose,
7677
NoStdin: opts.noStdin,
7778
Proxy: opts.proxy,
7879
}
80+
backend, err := compose.NewComposeService(dockerCli, backendOptions.Options...)
81+
if err != nil {
82+
return err
83+
}
7984
return backend.Attach(ctx, projectName, attachOpts)
8085
}

cmd/compose/build.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"github.com/compose-spec/compose-go/v2/types"
2727
"github.com/docker/cli/cli/command"
2828
cliopts "github.com/docker/cli/opts"
29+
"github.com/docker/compose/v2/pkg/compose"
2930
ui "github.com/docker/compose/v2/pkg/progress"
3031
"github.com/spf13/cobra"
3132

@@ -90,7 +91,7 @@ func (opts buildOptions) toAPIBuildOptions(services []string) (api.BuildOptions,
9091
}, nil
9192
}
9293

93-
func buildCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Compose) *cobra.Command {
94+
func buildCommand(p *ProjectOptions, dockerCli command.Cli, backendOptions *BackendOptions) *cobra.Command {
9495
opts := buildOptions{
9596
ProjectOptions: p,
9697
}
@@ -115,7 +116,7 @@ func buildCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Compose)
115116
if cmd.Flags().Changed("progress") && opts.ssh == "" {
116117
fmt.Fprint(os.Stderr, "--progress is a global compose flag, better use `docker compose --progress xx build ...\n")
117118
}
118-
return runBuild(ctx, dockerCli, backend, opts, args)
119+
return runBuild(ctx, dockerCli, backendOptions, opts, args)
119120
}),
120121
ValidArgsFunction: completeServiceNames(dockerCli, p),
121122
}
@@ -148,7 +149,7 @@ func buildCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Compose)
148149
return cmd
149150
}
150151

151-
func runBuild(ctx context.Context, dockerCli command.Cli, backend api.Compose, opts buildOptions, services []string) error {
152+
func runBuild(ctx context.Context, dockerCli command.Cli, backendOptions *BackendOptions, opts buildOptions, services []string) error {
152153
opts.All = true // do not drop resources as build may involve some dependencies by additional_contexts
153154
project, _, err := opts.ToProject(ctx, dockerCli, nil, cli.WithResolvedPaths(true), cli.WithoutEnvironmentResolution)
154155
if err != nil {
@@ -165,5 +166,9 @@ func runBuild(ctx context.Context, dockerCli command.Cli, backend api.Compose, o
165166
}
166167
apiBuildOptions.Attestations = true
167168

169+
backend, err := compose.NewComposeService(dockerCli, backendOptions.Options...)
170+
if err != nil {
171+
return err
172+
}
168173
return backend.Build(ctx, project, apiBuildOptions)
169174
}

cmd/compose/commit.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"github.com/docker/cli/cli/command"
2323
"github.com/docker/cli/opts"
2424
"github.com/docker/compose/v2/pkg/api"
25+
"github.com/docker/compose/v2/pkg/compose"
2526
"github.com/spf13/cobra"
2627
)
2728

@@ -39,7 +40,7 @@ type commitOptions struct {
3940
index int
4041
}
4142

42-
func commitCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Compose) *cobra.Command {
43+
func commitCommand(p *ProjectOptions, dockerCli command.Cli, backendOptions *BackendOptions) *cobra.Command {
4344
options := commitOptions{
4445
ProjectOptions: p,
4546
}
@@ -56,7 +57,7 @@ func commitCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Compose
5657
return nil
5758
}),
5859
RunE: Adapt(func(ctx context.Context, args []string) error {
59-
return runCommit(ctx, dockerCli, backend, options)
60+
return runCommit(ctx, dockerCli, backendOptions, options)
6061
}),
6162
ValidArgsFunction: completeServiceNames(dockerCli, p),
6263
}
@@ -73,12 +74,16 @@ func commitCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Compose
7374
return cmd
7475
}
7576

76-
func runCommit(ctx context.Context, dockerCli command.Cli, backend api.Compose, options commitOptions) error {
77+
func runCommit(ctx context.Context, dockerCli command.Cli, backendOptions *BackendOptions, options commitOptions) error {
7778
projectName, err := options.toProjectName(ctx, dockerCli)
7879
if err != nil {
7980
return err
8081
}
8182

83+
backend, err := compose.NewComposeService(dockerCli, backendOptions.Options...)
84+
if err != nil {
85+
return err
86+
}
8287
return backend.Commit(ctx, projectName, api.CommitOptions{
8388
Service: options.service,
8489
Reference: options.reference,

cmd/compose/completion.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222

2323
"github.com/docker/cli/cli/command"
2424
"github.com/docker/compose/v2/pkg/api"
25+
"github.com/docker/compose/v2/pkg/compose"
2526
"github.com/spf13/cobra"
2627
)
2728

@@ -52,8 +53,13 @@ func completeServiceNames(dockerCli command.Cli, p *ProjectOptions) validArgsFn
5253
}
5354
}
5455

55-
func completeProjectNames(backend api.Compose) func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
56+
func completeProjectNames(dockerCli command.Cli, backendOptions *BackendOptions) func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
5657
return func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
58+
backend, err := compose.NewComposeService(dockerCli, backendOptions.Options...)
59+
if err != nil {
60+
return nil, cobra.ShellCompDirectiveError
61+
}
62+
5763
list, err := backend.List(cmd.Context(), api.ListOptions{
5864
All: true,
5965
})

cmd/compose/compose.go

Lines changed: 46 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import (
4242
"github.com/docker/compose/v2/cmd/formatter"
4343
"github.com/docker/compose/v2/internal/tracing"
4444
"github.com/docker/compose/v2/pkg/api"
45+
"github.com/docker/compose/v2/pkg/compose"
4546
ui "github.com/docker/compose/v2/pkg/progress"
4647
"github.com/docker/compose/v2/pkg/remote"
4748
"github.com/docker/compose/v2/pkg/utils"
@@ -415,8 +416,16 @@ func RunningAsStandalone() bool {
415416
return len(os.Args) < 2 || os.Args[1] != metadata.MetadataSubcommandName && os.Args[1] != PluginName
416417
}
417418

419+
type BackendOptions struct {
420+
Options []compose.Option
421+
}
422+
423+
func (o *BackendOptions) Add(option compose.Option) {
424+
o.Options = append(o.Options, option)
425+
}
426+
418427
// RootCommand returns the compose command with its child commands
419-
func RootCommand(dockerCli command.Cli, backend api.Compose) *cobra.Command { //nolint:gocyclo
428+
func RootCommand(dockerCli command.Cli, backendOptions *BackendOptions) *cobra.Command { //nolint:gocyclo
420429
// filter out useless commandConn.CloseWrite warning message that can occur
421430
// when using a remote context that is unreachable: "commandConn.CloseWrite: commandconn: failed to wait: signal: killed"
422431
// https://github.com/docker/cli/blob/e1f24d3c93df6752d3c27c8d61d18260f141310c/cli/connhelper/commandconn/commandconn.go#L203-L215
@@ -456,9 +465,7 @@ func RootCommand(dockerCli command.Cli, backend api.Compose) *cobra.Command { //
456465
}
457466
},
458467
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
459-
ctx := cmd.Context()
460468
parent := cmd.Root()
461-
462469
if parent != nil {
463470
parentPrerun := parent.PersistentPreRunE
464471
if parentPrerun != nil {
@@ -560,64 +567,61 @@ func RootCommand(dockerCli command.Cli, backend api.Compose) *cobra.Command { //
560567
}
561568
if parallel > 0 {
562569
logrus.Debugf("Limiting max concurrency to %d jobs", parallel)
563-
backend.MaxConcurrency(parallel)
570+
backendOptions.Add(compose.WithMaxConcurrency(parallel))
564571
}
565572

566573
// dry run detection
567-
ctx, err = backend.DryRunMode(ctx, dryRun)
568-
if err != nil {
569-
return err
574+
if dryRun {
575+
backendOptions.Add(compose.WithDryRun)
570576
}
571-
cmd.SetContext(ctx)
572-
573577
return nil
574578
},
575579
}
576580

577581
c.AddCommand(
578-
upCommand(&opts, dockerCli, backend),
579-
downCommand(&opts, dockerCli, backend),
580-
startCommand(&opts, dockerCli, backend),
581-
restartCommand(&opts, dockerCli, backend),
582-
stopCommand(&opts, dockerCli, backend),
583-
psCommand(&opts, dockerCli, backend),
584-
listCommand(dockerCli, backend),
585-
logsCommand(&opts, dockerCli, backend),
582+
upCommand(&opts, dockerCli, backendOptions),
583+
downCommand(&opts, dockerCli, backendOptions),
584+
startCommand(&opts, dockerCli, backendOptions),
585+
restartCommand(&opts, dockerCli, backendOptions),
586+
stopCommand(&opts, dockerCli, backendOptions),
587+
psCommand(&opts, dockerCli, backendOptions),
588+
listCommand(dockerCli, backendOptions),
589+
logsCommand(&opts, dockerCli, backendOptions),
586590
configCommand(&opts, dockerCli),
587-
killCommand(&opts, dockerCli, backend),
588-
runCommand(&opts, dockerCli, backend),
589-
removeCommand(&opts, dockerCli, backend),
590-
execCommand(&opts, dockerCli, backend),
591-
attachCommand(&opts, dockerCli, backend),
592-
exportCommand(&opts, dockerCli, backend),
593-
commitCommand(&opts, dockerCli, backend),
594-
pauseCommand(&opts, dockerCli, backend),
595-
unpauseCommand(&opts, dockerCli, backend),
596-
topCommand(&opts, dockerCli, backend),
597-
eventsCommand(&opts, dockerCli, backend),
598-
portCommand(&opts, dockerCli, backend),
599-
imagesCommand(&opts, dockerCli, backend),
591+
killCommand(&opts, dockerCli, backendOptions),
592+
runCommand(&opts, dockerCli, backendOptions),
593+
removeCommand(&opts, dockerCli, backendOptions),
594+
execCommand(&opts, dockerCli, backendOptions),
595+
attachCommand(&opts, dockerCli, backendOptions),
596+
exportCommand(&opts, dockerCli, backendOptions),
597+
commitCommand(&opts, dockerCli, backendOptions),
598+
pauseCommand(&opts, dockerCli, backendOptions),
599+
unpauseCommand(&opts, dockerCli, backendOptions),
600+
topCommand(&opts, dockerCli, backendOptions),
601+
eventsCommand(&opts, dockerCli, backendOptions),
602+
portCommand(&opts, dockerCli, backendOptions),
603+
imagesCommand(&opts, dockerCli, backendOptions),
600604
versionCommand(dockerCli),
601-
buildCommand(&opts, dockerCli, backend),
602-
pushCommand(&opts, dockerCli, backend),
603-
pullCommand(&opts, dockerCli, backend),
604-
createCommand(&opts, dockerCli, backend),
605-
copyCommand(&opts, dockerCli, backend),
606-
waitCommand(&opts, dockerCli, backend),
607-
scaleCommand(&opts, dockerCli, backend),
605+
buildCommand(&opts, dockerCli, backendOptions),
606+
pushCommand(&opts, dockerCli, backendOptions),
607+
pullCommand(&opts, dockerCli, backendOptions),
608+
createCommand(&opts, dockerCli, backendOptions),
609+
copyCommand(&opts, dockerCli, backendOptions),
610+
waitCommand(&opts, dockerCli, backendOptions),
611+
scaleCommand(&opts, dockerCli, backendOptions),
608612
statsCommand(&opts, dockerCli),
609-
watchCommand(&opts, dockerCli, backend),
610-
publishCommand(&opts, dockerCli, backend),
611-
alphaCommand(&opts, dockerCli, backend),
613+
watchCommand(&opts, dockerCli, backendOptions),
614+
publishCommand(&opts, dockerCli, backendOptions),
615+
alphaCommand(&opts, dockerCli, backendOptions),
612616
bridgeCommand(&opts, dockerCli),
613-
volumesCommand(&opts, dockerCli, backend),
617+
volumesCommand(&opts, dockerCli, backendOptions),
614618
)
615619

616620
c.Flags().SetInterspersed(false)
617621
opts.addProjectFlags(c.Flags())
618622
c.RegisterFlagCompletionFunc( //nolint:errcheck
619623
"project-name",
620-
completeProjectNames(backend),
624+
completeProjectNames(dockerCli, backendOptions),
621625
)
622626
c.RegisterFlagCompletionFunc( //nolint:errcheck
623627
"project-directory",

cmd/compose/cp.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222

2323
"github.com/docker/cli/cli"
2424
"github.com/docker/cli/cli/command"
25+
"github.com/docker/compose/v2/pkg/compose"
2526
"github.com/spf13/cobra"
2627

2728
"github.com/docker/compose/v2/pkg/api"
@@ -38,7 +39,7 @@ type copyOptions struct {
3839
copyUIDGID bool
3940
}
4041

41-
func copyCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Compose) *cobra.Command {
42+
func copyCommand(p *ProjectOptions, dockerCli command.Cli, backendOptions *BackendOptions) *cobra.Command {
4243
opts := copyOptions{
4344
ProjectOptions: p,
4445
}
@@ -59,7 +60,7 @@ func copyCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Compose)
5960
RunE: AdaptCmd(func(ctx context.Context, cmd *cobra.Command, args []string) error {
6061
opts.source = args[0]
6162
opts.destination = args[1]
62-
return runCopy(ctx, dockerCli, backend, opts)
63+
return runCopy(ctx, dockerCli, backendOptions, opts)
6364
}),
6465
ValidArgsFunction: completeServiceNames(dockerCli, p),
6566
}
@@ -73,12 +74,16 @@ func copyCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Compose)
7374
return copyCmd
7475
}
7576

76-
func runCopy(ctx context.Context, dockerCli command.Cli, backend api.Compose, opts copyOptions) error {
77+
func runCopy(ctx context.Context, dockerCli command.Cli, backendOptions *BackendOptions, opts copyOptions) error {
7778
name, err := opts.toProjectName(ctx, dockerCli)
7879
if err != nil {
7980
return err
8081
}
8182

83+
backend, err := compose.NewComposeService(dockerCli, backendOptions.Options...)
84+
if err != nil {
85+
return err
86+
}
8287
return backend.Copy(ctx, name, api.CopyOptions{
8388
Source: opts.source,
8489
Destination: opts.destination,

0 commit comments

Comments
 (0)