@@ -23,6 +23,7 @@ import (
2323 "encoding/json"
2424 "errors"
2525 "fmt"
26+ "math/rand"
2627 "os"
2728 "os/exec"
2829 "path/filepath"
@@ -249,20 +250,22 @@ func (s *composeService) doBuildBake(ctx context.Context, project *types.Project
249250 }
250251 logrus .Debugf ("bake build config:\n %s" , string (b ))
251252
252- metadata , err := os .CreateTemp (os .TempDir (), "compose" )
253- if err != nil {
254- return nil , err
253+ var metadataFile string
254+ for {
255+ // we don't use os.CreateTemp here as we need a temporary file name, but don't want it actually created
256+ // as bake relies on atomicwriter and this creates conflict during rename
257+ metadataFile = filepath .Join (os .TempDir (), fmt .Sprintf ("compose-build-metadataFile-%d.json" , rand .Int31 ()))
258+ if _ , err = os .Stat (metadataFile ); os .IsNotExist (err ) {
259+ break
260+ }
255261 }
256- defer func () {
257- _ = os .Remove (metadata .Name ())
258- }()
259262
260263 buildx , err := manager .GetPlugin ("buildx" , s .dockerCli , & cobra.Command {})
261264 if err != nil {
262265 return nil , err
263266 }
264267
265- args := []string {"bake" , "--file" , "-" , "--progress" , "rawjson" , "--metadata-file" , metadata . Name () }
268+ args := []string {"bake" , "--file" , "-" , "--progress" , "rawjson" , "--metadata-file" , metadataFile }
266269 mustAllow := buildx .Version != "" && versions .GreaterThanOrEqualTo (buildx .Version [1 :], "0.17.0" )
267270 if mustAllow {
268271 // FIXME we should prompt user about this, but this is a breaking change in UX
@@ -343,7 +346,7 @@ func (s *composeService) doBuildBake(ctx context.Context, project *types.Project
343346 return nil , fmt .Errorf ("failed to execute bake: %w" , err )
344347 }
345348
346- b , err = os .ReadFile (metadata . Name () )
349+ b , err = os .ReadFile (metadataFile )
347350 if err != nil {
348351 return nil , err
349352 }
0 commit comments