@@ -26,18 +26,16 @@ import (
26
26
"strings"
27
27
"syscall"
28
28
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
-
35
29
"github.com/compose-spec/compose-go/cli"
30
+ "github.com/compose-spec/compose-go/dotenv"
36
31
"github.com/compose-spec/compose-go/types"
37
32
composegoutils "github.com/compose-spec/compose-go/utils"
38
33
"github.com/docker/buildx/util/logutil"
34
+ buildx "github.com/docker/buildx/util/progress"
39
35
dockercli "github.com/docker/cli/cli"
40
36
"github.com/docker/cli/cli-plugins/manager"
37
+ "github.com/docker/cli/cli/command"
38
+ "github.com/docker/compose/v2/pkg/remote"
41
39
"github.com/morikuni/aec"
42
40
"github.com/pkg/errors"
43
41
"github.com/sirupsen/logrus"
@@ -119,6 +117,7 @@ type ProjectOptions struct {
119
117
EnvFiles []string
120
118
Compatibility bool
121
119
Progress string
120
+ Offline bool
122
121
}
123
122
124
123
// ProjectFunc does stuff within a types.Project
@@ -128,34 +127,22 @@ type ProjectFunc func(ctx context.Context, project *types.Project) error
128
127
type ProjectServicesFunc func (ctx context.Context , project * types.Project , services []string ) error
129
128
130
129
// 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 {
133
132
return fn (ctx , project )
134
133
})
135
134
}
136
135
137
136
// 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 {
139
138
return Adapt (func (ctx context.Context , args []string ) error {
140
139
options := []cli.ProjectOptionsFn {
141
140
cli .WithResolvedPaths (true ),
142
141
cli .WithDiscardEnvFile ,
143
142
cli .WithContext (ctx ),
144
143
}
145
144
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 ... )
159
146
if err != nil {
160
147
return err
161
148
}
@@ -176,11 +163,11 @@ func (o *ProjectOptions) addProjectFlags(f *pflag.FlagSet) {
176
163
_ = f .MarkHidden ("workdir" )
177
164
}
178
165
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 ) {
180
167
name := o .ProjectName
181
168
var project * types.Project
182
169
if len (o .ConfigPaths ) > 0 || o .ProjectName == "" {
183
- p , err := o .ToProject (services , cli .WithDiscardEnvFile )
170
+ p , err := o .ToProject (dockerCli , services , cli .WithDiscardEnvFile )
184
171
if err != nil {
185
172
envProjectName := os .Getenv (ComposeProjectName )
186
173
if envProjectName != "" {
@@ -194,7 +181,7 @@ func (o *ProjectOptions) projectOrName(services ...string) (*types.Project, stri
194
181
return project , name , nil
195
182
}
196
183
197
- func (o * ProjectOptions ) toProjectName () (string , error ) {
184
+ func (o * ProjectOptions ) toProjectName (dockerCli command. Cli ) (string , error ) {
198
185
if o .ProjectName != "" {
199
186
return o .ProjectName , nil
200
187
}
@@ -204,14 +191,22 @@ func (o *ProjectOptions) toProjectName() (string, error) {
204
191
return envProjectName , nil
205
192
}
206
193
207
- project , err := o .ToProject (nil )
194
+ project , err := o .ToProject (dockerCli , nil )
208
195
if err != nil {
209
196
return "" , err
210
197
}
211
198
return project .Name , nil
212
199
}
213
200
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
+
215
210
options , err := o .toProjectOptions (po ... )
216
211
if err != nil {
217
212
return nil , compose .WrapComposeError (err )
@@ -256,6 +251,33 @@ func (o *ProjectOptions) ToProject(services []string, po ...cli.ProjectOptionsFn
256
251
return project , err
257
252
}
258
253
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
+
259
281
func (o * ProjectOptions ) toProjectOptions (po ... cli.ProjectOptionsFn ) (* cli.ProjectOptions , error ) {
260
282
return cli .NewProjectOptions (o .ConfigPaths ,
261
283
append (po ,
@@ -429,32 +451,32 @@ func RootCommand(dockerCli command.Cli, backend api.Service) *cobra.Command { //
429
451
430
452
c .AddCommand (
431
453
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 ),
436
458
psCommand (& opts , dockerCli , backend ),
437
459
listCommand (dockerCli , backend ),
438
460
logsCommand (& opts , dockerCli , backend ),
439
461
configCommand (& opts , dockerCli , backend ),
440
- killCommand (& opts , backend ),
462
+ killCommand (& opts , dockerCli , backend ),
441
463
runCommand (& opts , dockerCli , backend ),
442
- removeCommand (& opts , backend ),
464
+ removeCommand (& opts , dockerCli , backend ),
443
465
execCommand (& opts , dockerCli , backend ),
444
- pauseCommand (& opts , backend ),
445
- unpauseCommand (& opts , backend ),
466
+ pauseCommand (& opts , dockerCli , backend ),
467
+ unpauseCommand (& opts , dockerCli , backend ),
446
468
topCommand (& opts , dockerCli , backend ),
447
469
eventsCommand (& opts , dockerCli , backend ),
448
470
portCommand (& opts , dockerCli , backend ),
449
471
imagesCommand (& opts , dockerCli , backend ),
450
472
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 ),
458
480
)
459
481
460
482
c .Flags ().SetInterspersed (false )
@@ -477,7 +499,7 @@ func RootCommand(dockerCli command.Cli, backend api.Service) *cobra.Command { //
477
499
)
478
500
c .RegisterFlagCompletionFunc ( //nolint:errcheck
479
501
"profile" ,
480
- completeProfileNames (& opts ),
502
+ completeProfileNames (dockerCli , & opts ),
481
503
)
482
504
483
505
c .Flags ().StringVar (& ansi , "ansi" , "auto" , `Control when to print ANSI control characters ("never"|"always"|"auto")` )
0 commit comments