Skip to content

Commit e0f39eb

Browse files
committed
pull OCI remote resource
Signed-off-by: Nicolas De Loof <[email protected]>
1 parent c9d54f0 commit e0f39eb

39 files changed

+447
-255
lines changed

cmd/compose/alpha.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,13 @@
1515
package compose
1616

1717
import (
18+
"github.com/docker/cli/cli/command"
1819
"github.com/docker/compose/v2/pkg/api"
1920
"github.com/spf13/cobra"
2021
)
2122

2223
// alphaCommand groups all experimental subcommands
23-
func alphaCommand(p *ProjectOptions, backend api.Service) *cobra.Command {
24+
func alphaCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Service) *cobra.Command {
2425
cmd := &cobra.Command{
2526
Short: "Experimental commands",
2627
Use: "alpha [COMMAND]",
@@ -30,9 +31,9 @@ func alphaCommand(p *ProjectOptions, backend api.Service) *cobra.Command {
3031
},
3132
}
3233
cmd.AddCommand(
33-
watchCommand(p, backend),
34-
vizCommand(p, backend),
35-
publishCommand(p, backend),
34+
watchCommand(p, dockerCli, backend),
35+
vizCommand(p, dockerCli, backend),
36+
publishCommand(p, dockerCli, backend),
3637
)
3738
return cmd
3839
}

cmd/compose/build.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"github.com/compose-spec/compose-go/loader"
2727
"github.com/compose-spec/compose-go/types"
2828
buildx "github.com/docker/buildx/util/progress"
29+
"github.com/docker/cli/cli/command"
2930
cliopts "github.com/docker/cli/opts"
3031
ui "github.com/docker/compose/v2/pkg/progress"
3132
"github.com/spf13/cobra"
@@ -72,7 +73,7 @@ func (opts buildOptions) toAPIBuildOptions(services []string) (api.BuildOptions,
7273
}, nil
7374
}
7475

75-
func buildCommand(p *ProjectOptions, backend api.Service) *cobra.Command {
76+
func buildCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Service) *cobra.Command {
7677
opts := buildOptions{
7778
ProjectOptions: p,
7879
}
@@ -97,9 +98,9 @@ func buildCommand(p *ProjectOptions, backend api.Service) *cobra.Command {
9798
if cmd.Flags().Changed("progress") && opts.ssh == "" {
9899
fmt.Fprint(os.Stderr, "--progress is a global compose flag, better use `docker compose --progress xx build ...")
99100
}
100-
return runBuild(ctx, backend, opts, args)
101+
return runBuild(ctx, dockerCli, backend, opts, args)
101102
}),
102-
ValidArgsFunction: completeServiceNames(p),
103+
ValidArgsFunction: completeServiceNames(dockerCli, p),
103104
}
104105
cmd.Flags().BoolVar(&opts.push, "push", false, "Push service images.")
105106
cmd.Flags().BoolVarP(&opts.quiet, "quiet", "q", false, "Don't print anything to STDOUT")
@@ -123,8 +124,8 @@ func buildCommand(p *ProjectOptions, backend api.Service) *cobra.Command {
123124
return cmd
124125
}
125126

126-
func runBuild(ctx context.Context, backend api.Service, opts buildOptions, services []string) error {
127-
project, err := opts.ToProject(services, cli.WithResolvedPaths(true))
127+
func runBuild(ctx context.Context, dockerCli command.Cli, backend api.Service, opts buildOptions, services []string) error {
128+
project, err := opts.ToProject(dockerCli, services, cli.WithResolvedPaths(true))
128129
if err != nil {
129130
return err
130131
}

cmd/compose/completion.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"sort"
2121
"strings"
2222

23+
"github.com/docker/cli/cli/command"
2324
"github.com/docker/compose/v2/pkg/api"
2425
"github.com/spf13/cobra"
2526
)
@@ -33,9 +34,10 @@ func noCompletion() validArgsFn {
3334
}
3435
}
3536

36-
func completeServiceNames(p *ProjectOptions) validArgsFn {
37+
func completeServiceNames(dockerCli command.Cli, p *ProjectOptions) validArgsFn {
3738
return func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
38-
project, err := p.ToProject(nil)
39+
p.Offline = true
40+
project, err := p.ToProject(dockerCli, nil)
3941
if err != nil {
4042
return nil, cobra.ShellCompDirectiveNoFileComp
4143
}
@@ -67,9 +69,10 @@ func completeProjectNames(backend api.Service) func(cmd *cobra.Command, args []s
6769
}
6870
}
6971

70-
func completeProfileNames(p *ProjectOptions) validArgsFn {
72+
func completeProfileNames(dockerCli command.Cli, p *ProjectOptions) validArgsFn {
7173
return func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
72-
project, err := p.ToProject(nil)
74+
p.Offline = true
75+
project, err := p.ToProject(dockerCli, nil)
7376
if err != nil {
7477
return nil, cobra.ShellCompDirectiveNoFileComp
7578
}

cmd/compose/compose.go

Lines changed: 65 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,16 @@ import (
2626
"strings"
2727
"syscall"
2828

29-
buildx "github.com/docker/buildx/util/progress"
30-
31-
"github.com/compose-spec/compose-go/dotenv"
32-
"github.com/docker/cli/cli/command"
33-
"github.com/docker/compose/v2/pkg/remote"
34-
3529
"github.com/compose-spec/compose-go/cli"
30+
"github.com/compose-spec/compose-go/dotenv"
3631
"github.com/compose-spec/compose-go/types"
3732
composegoutils "github.com/compose-spec/compose-go/utils"
3833
"github.com/docker/buildx/util/logutil"
34+
buildx "github.com/docker/buildx/util/progress"
3935
dockercli "github.com/docker/cli/cli"
4036
"github.com/docker/cli/cli-plugins/manager"
37+
"github.com/docker/cli/cli/command"
38+
"github.com/docker/compose/v2/pkg/remote"
4139
"github.com/morikuni/aec"
4240
"github.com/pkg/errors"
4341
"github.com/sirupsen/logrus"
@@ -119,6 +117,7 @@ type ProjectOptions struct {
119117
EnvFiles []string
120118
Compatibility bool
121119
Progress string
120+
Offline bool
122121
}
123122

124123
// ProjectFunc does stuff within a types.Project
@@ -128,34 +127,22 @@ type ProjectFunc func(ctx context.Context, project *types.Project) error
128127
type ProjectServicesFunc func(ctx context.Context, project *types.Project, services []string) error
129128

130129
// WithProject creates a cobra run command from a ProjectFunc based on configured project options and selected services
131-
func (o *ProjectOptions) WithProject(fn ProjectFunc) func(cmd *cobra.Command, args []string) error {
132-
return o.WithServices(func(ctx context.Context, project *types.Project, services []string) error {
130+
func (o *ProjectOptions) WithProject(fn ProjectFunc, dockerCli command.Cli) func(cmd *cobra.Command, args []string) error {
131+
return o.WithServices(dockerCli, func(ctx context.Context, project *types.Project, services []string) error {
133132
return fn(ctx, project)
134133
})
135134
}
136135

137136
// WithServices creates a cobra run command from a ProjectFunc based on configured project options and selected services
138-
func (o *ProjectOptions) WithServices(fn ProjectServicesFunc) func(cmd *cobra.Command, args []string) error {
137+
func (o *ProjectOptions) WithServices(dockerCli command.Cli, fn ProjectServicesFunc) func(cmd *cobra.Command, args []string) error {
139138
return Adapt(func(ctx context.Context, args []string) error {
140139
options := []cli.ProjectOptionsFn{
141140
cli.WithResolvedPaths(true),
142141
cli.WithDiscardEnvFile,
143142
cli.WithContext(ctx),
144143
}
145144

146-
enabled, err := remote.GitRemoteLoaderEnabled()
147-
if err != nil {
148-
return err
149-
}
150-
if enabled {
151-
git, err := remote.NewGitRemoteLoader()
152-
if err != nil {
153-
return err
154-
}
155-
options = append(options, cli.WithResourceLoader(git))
156-
}
157-
158-
project, err := o.ToProject(args, options...)
145+
project, err := o.ToProject(dockerCli, args, options...)
159146
if err != nil {
160147
return err
161148
}
@@ -176,11 +163,11 @@ func (o *ProjectOptions) addProjectFlags(f *pflag.FlagSet) {
176163
_ = f.MarkHidden("workdir")
177164
}
178165

179-
func (o *ProjectOptions) projectOrName(services ...string) (*types.Project, string, error) {
166+
func (o *ProjectOptions) projectOrName(dockerCli command.Cli, services ...string) (*types.Project, string, error) {
180167
name := o.ProjectName
181168
var project *types.Project
182169
if len(o.ConfigPaths) > 0 || o.ProjectName == "" {
183-
p, err := o.ToProject(services, cli.WithDiscardEnvFile)
170+
p, err := o.ToProject(dockerCli, services, cli.WithDiscardEnvFile)
184171
if err != nil {
185172
envProjectName := os.Getenv(ComposeProjectName)
186173
if envProjectName != "" {
@@ -194,7 +181,7 @@ func (o *ProjectOptions) projectOrName(services ...string) (*types.Project, stri
194181
return project, name, nil
195182
}
196183

197-
func (o *ProjectOptions) toProjectName() (string, error) {
184+
func (o *ProjectOptions) toProjectName(dockerCli command.Cli) (string, error) {
198185
if o.ProjectName != "" {
199186
return o.ProjectName, nil
200187
}
@@ -204,14 +191,22 @@ func (o *ProjectOptions) toProjectName() (string, error) {
204191
return envProjectName, nil
205192
}
206193

207-
project, err := o.ToProject(nil)
194+
project, err := o.ToProject(dockerCli, nil)
208195
if err != nil {
209196
return "", err
210197
}
211198
return project.Name, nil
212199
}
213200

214-
func (o *ProjectOptions) ToProject(services []string, po ...cli.ProjectOptionsFn) (*types.Project, error) {
201+
func (o *ProjectOptions) ToProject(dockerCli command.Cli, services []string, po ...cli.ProjectOptionsFn) (*types.Project, error) {
202+
if !o.Offline {
203+
var err error
204+
po, err = o.configureRemoteLoaders(dockerCli, po)
205+
if err != nil {
206+
return nil, err
207+
}
208+
}
209+
215210
options, err := o.toProjectOptions(po...)
216211
if err != nil {
217212
return nil, compose.WrapComposeError(err)
@@ -256,6 +251,33 @@ func (o *ProjectOptions) ToProject(services []string, po ...cli.ProjectOptionsFn
256251
return project, err
257252
}
258253

254+
func (o *ProjectOptions) configureRemoteLoaders(dockerCli command.Cli, po []cli.ProjectOptionsFn) ([]cli.ProjectOptionsFn, error) {
255+
enabled, err := remote.GitRemoteLoaderEnabled()
256+
if err != nil {
257+
return nil, err
258+
}
259+
if enabled {
260+
git, err := remote.NewGitRemoteLoader(o.Offline)
261+
if err != nil {
262+
return nil, err
263+
}
264+
po = append(po, cli.WithResourceLoader(git))
265+
}
266+
267+
enabled, err = remote.OCIRemoteLoaderEnabled()
268+
if err != nil {
269+
return nil, err
270+
}
271+
if enabled {
272+
git, err := remote.NewOCIRemoteLoader(dockerCli, o.Offline)
273+
if err != nil {
274+
return nil, err
275+
}
276+
po = append(po, cli.WithResourceLoader(git))
277+
}
278+
return po, nil
279+
}
280+
259281
func (o *ProjectOptions) toProjectOptions(po ...cli.ProjectOptionsFn) (*cli.ProjectOptions, error) {
260282
return cli.NewProjectOptions(o.ConfigPaths,
261283
append(po,
@@ -429,32 +451,32 @@ func RootCommand(dockerCli command.Cli, backend api.Service) *cobra.Command { //
429451

430452
c.AddCommand(
431453
upCommand(&opts, dockerCli, backend),
432-
downCommand(&opts, backend),
433-
startCommand(&opts, backend),
434-
restartCommand(&opts, backend),
435-
stopCommand(&opts, backend),
454+
downCommand(&opts, dockerCli, backend),
455+
startCommand(&opts, dockerCli, backend),
456+
restartCommand(&opts, dockerCli, backend),
457+
stopCommand(&opts, dockerCli, backend),
436458
psCommand(&opts, dockerCli, backend),
437459
listCommand(dockerCli, backend),
438460
logsCommand(&opts, dockerCli, backend),
439461
configCommand(&opts, dockerCli, backend),
440-
killCommand(&opts, backend),
462+
killCommand(&opts, dockerCli, backend),
441463
runCommand(&opts, dockerCli, backend),
442-
removeCommand(&opts, backend),
464+
removeCommand(&opts, dockerCli, backend),
443465
execCommand(&opts, dockerCli, backend),
444-
pauseCommand(&opts, backend),
445-
unpauseCommand(&opts, backend),
466+
pauseCommand(&opts, dockerCli, backend),
467+
unpauseCommand(&opts, dockerCli, backend),
446468
topCommand(&opts, dockerCli, backend),
447469
eventsCommand(&opts, dockerCli, backend),
448470
portCommand(&opts, dockerCli, backend),
449471
imagesCommand(&opts, dockerCli, backend),
450472
versionCommand(dockerCli),
451-
buildCommand(&opts, backend),
452-
pushCommand(&opts, backend),
453-
pullCommand(&opts, backend),
454-
createCommand(&opts, backend),
455-
copyCommand(&opts, backend),
456-
waitCommand(&opts, backend),
457-
alphaCommand(&opts, backend),
473+
buildCommand(&opts, dockerCli, backend),
474+
pushCommand(&opts, dockerCli, backend),
475+
pullCommand(&opts, dockerCli, backend),
476+
createCommand(&opts, dockerCli, backend),
477+
copyCommand(&opts, dockerCli, backend),
478+
waitCommand(&opts, dockerCli, backend),
479+
alphaCommand(&opts, dockerCli, backend),
458480
)
459481

460482
c.Flags().SetInterspersed(false)
@@ -477,7 +499,7 @@ func RootCommand(dockerCli command.Cli, backend api.Service) *cobra.Command { //
477499
)
478500
c.RegisterFlagCompletionFunc( //nolint:errcheck
479501
"profile",
480-
completeProfileNames(&opts),
502+
completeProfileNames(dockerCli, &opts),
481503
)
482504

483505
c.Flags().StringVar(&ansi, "ansi", "auto", `Control when to print ANSI control characters ("never"|"always"|"auto")`)

0 commit comments

Comments
 (0)