@@ -314,36 +314,34 @@ func Run(ctx context.Context, options Options) error {
314
314
}
315
315
}
316
316
317
- var buildParams * devcontainer.Compiled
318
-
319
- defaultBuildParams := func () error {
317
+ defaultBuildParams := func () (* devcontainer.Compiled , error ) {
320
318
dockerfile := filepath .Join (MagicDir , "Dockerfile" )
321
319
file , err := options .Filesystem .OpenFile (dockerfile , os .O_CREATE | os .O_WRONLY , 0644 )
322
320
if err != nil {
323
- return err
321
+ return nil , err
324
322
}
325
323
defer file .Close ()
326
324
if options .FallbackImage == "" {
327
325
if fallbackErr != nil {
328
- return xerrors .Errorf ("%s: %w" , fallbackErr .Error (), ErrNoFallbackImage )
326
+ return nil , xerrors .Errorf ("%s: %w" , fallbackErr .Error (), ErrNoFallbackImage )
329
327
}
330
328
// We can't use errors.Join here because our tests
331
329
// don't support parsing a multiline error.
332
- return ErrNoFallbackImage
330
+ return nil , ErrNoFallbackImage
333
331
}
334
332
content := "FROM " + options .FallbackImage
335
333
_ , err = file .Write ([]byte (content ))
336
334
if err != nil {
337
- return err
335
+ return nil , err
338
336
}
339
- buildParams = & devcontainer.Compiled {
337
+ return & devcontainer.Compiled {
340
338
DockerfilePath : dockerfile ,
341
339
DockerfileContent : content ,
342
340
BuildContext : MagicDir ,
343
- }
344
- return nil
341
+ }, nil
345
342
}
346
343
344
+ var buildParams * devcontainer.Compiled
347
345
if options .DockerfilePath == "" {
348
346
// Only look for a devcontainer if a Dockerfile wasn't specified.
349
347
// devcontainer is a standard, so it's reasonable to be the default.
@@ -364,7 +362,16 @@ func Run(ctx context.Context, options Options) error {
364
362
}
365
363
devContainer , err := devcontainer .Parse (content )
366
364
if err == nil {
367
- buildParams , err = devContainer .Compile (options .Filesystem , devcontainerDir , MagicDir )
365
+ var fallbackDockerfile string
366
+ if ! devContainer .HasImage () && ! devContainer .HasDockerfile () {
367
+ defaultParams , err := defaultBuildParams ()
368
+ if err != nil {
369
+ return fmt .Errorf ("no Dockerfile or image found: %w" , err )
370
+ }
371
+ logf (codersdk .LogLevelInfo , "No Dockerfile or image specified; falling back to the default image..." )
372
+ fallbackDockerfile = defaultParams .DockerfilePath
373
+ }
374
+ buildParams , err = devContainer .Compile (options .Filesystem , devcontainerDir , MagicDir , fallbackDockerfile )
368
375
if err != nil {
369
376
return fmt .Errorf ("compile devcontainer.json: %w" , err )
370
377
}
@@ -393,7 +400,8 @@ func Run(ctx context.Context, options Options) error {
393
400
if buildParams == nil {
394
401
// If there isn't a devcontainer.json file in the repository,
395
402
// we fallback to whatever the `DefaultImage` is.
396
- err := defaultBuildParams ()
403
+ var err error
404
+ buildParams , err = defaultBuildParams ()
397
405
if err != nil {
398
406
return fmt .Errorf ("no Dockerfile or devcontainer.json found: %w" , err )
399
407
}
@@ -543,7 +551,7 @@ func Run(ctx context.Context, options Options) error {
543
551
}
544
552
logf (codersdk .LogLevelError , "Failed to build: %s" , err )
545
553
logf (codersdk .LogLevelError , "Falling back to the default image..." )
546
- err = defaultBuildParams ()
554
+ buildParams , err = defaultBuildParams ()
547
555
if err != nil {
548
556
return err
549
557
}
0 commit comments