Skip to content

Commit fa809ca

Browse files
committed
build compose backend with options, pass prompt as an option
Signed-off-by: Nicolas De Loof <[email protected]>
1 parent da5c57c commit fa809ca

Some content is hidden

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

47 files changed

+433
-472
lines changed

cmd/compose/alpha.go

Lines changed: 5 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,12 @@ package compose
1615

1716
import (
1817
"github.com/docker/cli/cli/command"
19-
"github.com/docker/compose/v2/pkg/api"
18+
"github.com/docker/compose/v2/pkg/compose"
2019
"github.com/spf13/cobra"
2120
)
2221

2322
// alphaCommand groups all experimental subcommands
24-
func alphaCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Service) *cobra.Command {
23+
func alphaCommand(p *ProjectOptions, dockerCli command.Cli, backendOptions []compose.Option) *cobra.Command {
2524
cmd := &cobra.Command{
2625
Short: "Experimental commands",
2726
Use: "alpha [COMMAND]",
@@ -31,9 +30,9 @@ func alphaCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Service)
3130
},
3231
}
3332
cmd.AddCommand(
34-
vizCommand(p, dockerCli, backend),
35-
publishCommand(p, dockerCli, backend),
36-
generateCommand(p, backend),
33+
vizCommand(p, dockerCli, backendOptions),
34+
publishCommand(p, dockerCli, backendOptions),
35+
generateCommand(p, dockerCli, backendOptions),
3736
)
3837
return cmd
3938
}

cmd/compose/attach.go

Lines changed: 9 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.Service) *cobra.Command {
39+
func attachCommand(p *ProjectOptions, dockerCli command.Cli, backendOptions []compose.Option) *cobra.Command {
3940
opts := attachOpts{
4041
composeOptions: &composeOptions{
4142
ProjectOptions: p,
@@ -50,7 +51,7 @@ func attachCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Service
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,12 +64,17 @@ func attachCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Service
6364
return runCmd
6465
}
6566

66-
func runAttach(ctx context.Context, dockerCli command.Cli, backend api.Service, opts attachOpts) error {
67+
func runAttach(ctx context.Context, dockerCli command.Cli, backendOptions []compose.Option, opts attachOpts) error {
6768
projectName, err := opts.toProjectName(ctx, dockerCli)
6869
if err != nil {
6970
return err
7071
}
7172

73+
backend, err := compose.NewComposeService(dockerCli, backendOptions...)
74+
if err != nil {
75+
return err
76+
}
77+
7278
attachOpts := api.AttachOptions{
7379
Service: opts.service,
7480
Index: opts.index,

cmd/compose/build.go

Lines changed: 9 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.Service) *cobra.Command {
94+
func buildCommand(p *ProjectOptions, dockerCli command.Cli, backendOptions []compose.Option) *cobra.Command {
9495
opts := buildOptions{
9596
ProjectOptions: p,
9697
}
@@ -115,7 +116,7 @@ func buildCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Service)
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.Service)
148149
return cmd
149150
}
150151

151-
func runBuild(ctx context.Context, dockerCli command.Cli, backend api.Service, opts buildOptions, services []string) error {
152+
func runBuild(ctx context.Context, dockerCli command.Cli, backendOptions []compose.Option, 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,10 @@ func runBuild(ctx context.Context, dockerCli command.Cli, backend api.Service, o
165166
}
166167
apiBuildOptions.Attestations = true
167168

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

cmd/compose/commit.go

Lines changed: 9 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.Service) *cobra.Command {
43+
func commitCommand(p *ProjectOptions, dockerCli command.Cli, backendOptions []compose.Option) *cobra.Command {
4344
options := commitOptions{
4445
ProjectOptions: p,
4546
}
@@ -56,7 +57,7 @@ func commitCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Service
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,17 @@ func commitCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Service
7374
return cmd
7475
}
7576

76-
func runCommit(ctx context.Context, dockerCli command.Cli, backend api.Service, options commitOptions) error {
77+
func runCommit(ctx context.Context, dockerCli command.Cli, backendOptions []compose.Option, 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...)
84+
if err != nil {
85+
return err
86+
}
87+
8288
return backend.Commit(ctx, projectName, api.CommitOptions{
8389
Service: options.service,
8490
Reference: options.reference,

cmd/compose/completion.go

Lines changed: 6 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,12 @@ func completeServiceNames(dockerCli command.Cli, p *ProjectOptions) validArgsFn
5253
}
5354
}
5455

55-
func completeProjectNames(backend api.Service) func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
56+
func completeProjectNames(cli command.Cli) 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(cli)
59+
if err != nil {
60+
return nil, cobra.ShellCompDirectiveError
61+
}
5762
list, err := backend.List(cmd.Context(), api.ListOptions{
5863
All: true,
5964
})

cmd/compose/compose.go

Lines changed: 47 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,10 @@ import (
4040
"github.com/docker/cli/cli/command"
4141
"github.com/docker/cli/pkg/kvfile"
4242
"github.com/docker/compose/v2/cmd/formatter"
43+
"github.com/docker/compose/v2/cmd/prompt"
4344
"github.com/docker/compose/v2/internal/tracing"
4445
"github.com/docker/compose/v2/pkg/api"
46+
"github.com/docker/compose/v2/pkg/compose"
4547
ui "github.com/docker/compose/v2/pkg/progress"
4648
"github.com/docker/compose/v2/pkg/remote"
4749
"github.com/docker/compose/v2/pkg/utils"
@@ -416,7 +418,7 @@ func RunningAsStandalone() bool {
416418
}
417419

418420
// RootCommand returns the compose command with its child commands
419-
func RootCommand(dockerCli command.Cli, backend api.Service) *cobra.Command { //nolint:gocyclo
421+
func RootCommand(dockerCli command.Cli) *cobra.Command { //nolint:gocyclo
420422
// filter out useless commandConn.CloseWrite warning message that can occur
421423
// when using a remote context that is unreachable: "commandConn.CloseWrite: commandconn: failed to wait: signal: killed"
422424
// https://github.com/docker/cli/blob/e1f24d3c93df6752d3c27c8d61d18260f141310c/cli/connhelper/commandconn/commandconn.go#L203-L215
@@ -436,6 +438,11 @@ func RootCommand(dockerCli command.Cli, backend api.Service) *cobra.Command { //
436438
parallel int
437439
dryRun bool
438440
)
441+
442+
backendOptions := []compose.Option{
443+
compose.WithPrompt(prompt.NewPrompt(dockerCli.In(), dockerCli.Out()).Confirm),
444+
}
445+
439446
c := &cobra.Command{
440447
Short: "Docker Compose",
441448
Long: "Define and run multi-container applications with Docker",
@@ -560,64 +567,64 @@ func RootCommand(dockerCli command.Cli, backend api.Service) *cobra.Command { //
560567
}
561568
if parallel > 0 {
562569
logrus.Debugf("Limiting max concurrency to %d jobs", parallel)
563-
backend.MaxConcurrency(parallel)
570+
backendOptions = append(backendOptions, compose.WithMaxConcurrency(parallel))
564571
}
565572

566-
// dry run detection
567-
ctx, err = backend.DryRunMode(ctx, dryRun)
568-
if err != nil {
569-
return err
573+
if dryRun {
574+
backendOptions = append(backendOptions, compose.WithDryRun)
575+
// FIXME to be removed after progress is moved under cmd
576+
ctx = context.WithValue(ctx, api.DryRunKey{}, dryRun)
577+
cmd.SetContext(ctx)
570578
}
571-
cmd.SetContext(ctx)
572579

573580
return nil
574581
},
575582
}
576583

577584
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),
585+
upCommand(&opts, dockerCli, backendOptions),
586+
downCommand(&opts, dockerCli, backendOptions),
587+
startCommand(&opts, dockerCli, backendOptions),
588+
restartCommand(&opts, dockerCli, backendOptions),
589+
stopCommand(&opts, dockerCli, backendOptions),
590+
psCommand(&opts, dockerCli, backendOptions),
591+
listCommand(dockerCli, backendOptions),
592+
logsCommand(&opts, dockerCli, backendOptions),
586593
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),
594+
killCommand(&opts, dockerCli, backendOptions),
595+
runCommand(&opts, dockerCli, backendOptions),
596+
removeCommand(&opts, dockerCli, backendOptions),
597+
execCommand(&opts, dockerCli, backendOptions),
598+
attachCommand(&opts, dockerCli, backendOptions),
599+
exportCommand(&opts, dockerCli, backendOptions),
600+
commitCommand(&opts, dockerCli, backendOptions),
601+
pauseCommand(&opts, dockerCli, backendOptions),
602+
unpauseCommand(&opts, dockerCli, backendOptions),
603+
topCommand(&opts, dockerCli, backendOptions),
604+
eventsCommand(&opts, dockerCli, backendOptions),
605+
portCommand(&opts, dockerCli, backendOptions),
606+
imagesCommand(&opts, dockerCli, backendOptions),
600607
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),
608+
buildCommand(&opts, dockerCli, backendOptions),
609+
pushCommand(&opts, dockerCli, backendOptions),
610+
pullCommand(&opts, dockerCli, backendOptions),
611+
createCommand(&opts, dockerCli, backendOptions),
612+
copyCommand(&opts, dockerCli, backendOptions),
613+
waitCommand(&opts, dockerCli, backendOptions),
614+
scaleCommand(&opts, dockerCli, backendOptions),
608615
statsCommand(&opts, dockerCli),
609-
watchCommand(&opts, dockerCli, backend),
610-
publishCommand(&opts, dockerCli, backend),
611-
alphaCommand(&opts, dockerCli, backend),
616+
watchCommand(&opts, dockerCli, backendOptions),
617+
publishCommand(&opts, dockerCli, backendOptions),
618+
alphaCommand(&opts, dockerCli, backendOptions),
612619
bridgeCommand(&opts, dockerCli),
613-
volumesCommand(&opts, dockerCli, backend),
620+
volumesCommand(&opts, dockerCli, backendOptions),
614621
)
615622

616623
c.Flags().SetInterspersed(false)
617624
opts.addProjectFlags(c.Flags())
618625
c.RegisterFlagCompletionFunc( //nolint:errcheck
619626
"project-name",
620-
completeProjectNames(backend),
627+
completeProjectNames(dockerCli),
621628
)
622629
c.RegisterFlagCompletionFunc( //nolint:errcheck
623630
"project-directory",

cmd/compose/cp.go

Lines changed: 9 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.Service) *cobra.Command {
42+
func copyCommand(p *ProjectOptions, dockerCli command.Cli, backendOptions []compose.Option) *cobra.Command {
4243
opts := copyOptions{
4344
ProjectOptions: p,
4445
}
@@ -59,7 +60,7 @@ func copyCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Service)
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,17 @@ func copyCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Service)
7374
return copyCmd
7475
}
7576

76-
func runCopy(ctx context.Context, dockerCli command.Cli, backend api.Service, opts copyOptions) error {
77+
func runCopy(ctx context.Context, dockerCli command.Cli, backendOptions []compose.Option, 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...)
84+
if err != nil {
85+
return err
86+
}
87+
8288
return backend.Copy(ctx, name, api.CopyOptions{
8389
Source: opts.source,
8490
Destination: opts.destination,

0 commit comments

Comments
 (0)