@@ -176,6 +176,18 @@ func (s *composeService) doBuildBake(ctx context.Context, project *types.Project
176176 }
177177 }
178178
179+ // tmpSecrets stores secret set by environment variables, so we don't have to "pollute" bake process's environment
180+ tmpSecrets , err := os .MkdirTemp ("" , "secrets" )
181+ if err != nil {
182+ return nil , err
183+ }
184+ defer func () {
185+ rerr := os .RemoveAll (tmpSecrets )
186+ if rerr != nil {
187+ logrus .Warnf ("Failed to removed temporary secrets directory %s: %s" , tmpSecrets , rerr .Error ())
188+ }
189+ }()
190+
179191 for serviceName , service := range project .Services {
180192 if service .Build == nil {
181193 continue
@@ -231,6 +243,11 @@ func (s *composeService) doBuildBake(ctx context.Context, project *types.Project
231243 noCache := service .Build .NoCache || options .NoCache
232244
233245 target := targets [serviceName ]
246+
247+ secrets , err := toBakeSecrets (project , build .Secrets , tmpSecrets )
248+ if err != nil {
249+ return nil , err
250+ }
234251 cfg .Targets [target ] = bakeTarget {
235252 Context : build .Context ,
236253 Contexts : additionalContexts (build .AdditionalContexts , targets ),
@@ -245,7 +262,7 @@ func (s *composeService) doBuildBake(ctx context.Context, project *types.Project
245262 NetworkMode : build .Network ,
246263 Platforms : build .Platforms ,
247264 Target : build .Target ,
248- Secrets : toBakeSecrets ( project , build . Secrets ) ,
265+ Secrets : secrets ,
249266 SSH : toBakeSSH (append (build .SSH , options .SSHs ... )),
250267 Pull : pull ,
251268 NoCache : noCache ,
@@ -454,7 +471,7 @@ func toBakeSSH(ssh types.SSHConfig) []string {
454471 return s
455472}
456473
457- func toBakeSecrets (project * types.Project , secrets []types.ServiceSecretConfig ) []string {
474+ func toBakeSecrets (project * types.Project , secrets []types.ServiceSecretConfig , tmpSecrets string ) ( []string , error ) {
458475 var s []string
459476 for _ , ref := range secrets {
460477 def := project .Secrets [ref .Source ]
@@ -464,12 +481,17 @@ func toBakeSecrets(project *types.Project, secrets []types.ServiceSecretConfig)
464481 }
465482 switch {
466483 case def .Environment != "" :
467- s = append (s , fmt .Sprintf ("id=%s,type=env,env=%s" , target , def .Environment ))
484+ sf := filepath .Join (tmpSecrets , def .Environment )
485+ err := os .WriteFile (sf , []byte (project .Environment [def .Environment ]), 0o600 )
486+ if err != nil {
487+ return nil , err
488+ }
489+ s = append (s , fmt .Sprintf ("id=%s,type=file,src=%s" , target , sf ))
468490 case def .File != "" :
469491 s = append (s , fmt .Sprintf ("id=%s,type=file,src=%s" , target , def .File ))
470492 }
471493 }
472- return s
494+ return s , nil
473495}
474496
475497func toBakeAttest (build types.BuildConfig ) []string {
0 commit comments