@@ -25,7 +25,7 @@ import (
2525 "errors"
2626 "fmt"
2727 "io"
28- "math/rand "
28+ "io/fs "
2929 "os"
3030 "os/exec"
3131 "path/filepath"
@@ -40,6 +40,7 @@ import (
4040 "github.com/docker/cli/cli/command/image/build"
4141 "github.com/docker/compose/v2/pkg/api"
4242 "github.com/docker/compose/v2/pkg/progress"
43+ "github.com/google/uuid"
4344 "github.com/moby/buildkit/client"
4445 gitutil "github.com/moby/buildkit/frontend/dockerfile/dfgitutil"
4546 "github.com/moby/buildkit/util/progress/progressui"
@@ -282,13 +283,20 @@ func (s *composeService) doBuildBake(ctx context.Context, project *types.Project
282283 }
283284 logrus .Debugf ("bake build config:\n %s" , string (b ))
284285
286+ tmpdir := os .TempDir ()
285287 var metadataFile string
286288 for {
287289 // we don't use os.CreateTemp here as we need a temporary file name, but don't want it actually created
288290 // as bake relies on atomicwriter and this creates conflict during rename
289- metadataFile = filepath .Join (os .TempDir (), fmt .Sprintf ("compose-build-metadataFile-%d.json" , rand .Int31 ()))
290- if _ , err = os .Stat (metadataFile ); os .IsNotExist (err ) {
291- break
291+ metadataFile = filepath .Join (tmpdir , fmt .Sprintf ("compose-build-metadataFile-%s.json" , uuid .New ().String ()))
292+ if _ , err = os .Stat (metadataFile ); err != nil {
293+ if os .IsNotExist (err ) {
294+ break
295+ }
296+ var pathError * fs.PathError
297+ if errors .As (err , & pathError ) {
298+ return nil , fmt .Errorf ("can't acces os.tempDir %s: %s" , tmpdir , pathError .Err )
299+ }
292300 }
293301 }
294302 defer func () {
@@ -359,9 +367,13 @@ func (s *composeService) doBuildBake(ctx context.Context, project *types.Project
359367 for {
360368 line , readErr := reader .ReadString ('\n' )
361369 if readErr != nil {
362- if readErr == io .EOF {
370+ switch {
371+ case readErr == io .EOF :
363372 break
364- } else {
373+ case errors .Is (readErr , os .ErrClosed ):
374+ logrus .Debugf ("bake stopped" )
375+ break
376+ default :
365377 return nil , fmt .Errorf ("failed to execute bake: %w" , readErr )
366378 }
367379 }
0 commit comments