Skip to content

Commit 2ca7b96

Browse files
ndeloofglours
authored andcommitted
resolve secrets based on env var before executing bake
Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com>
1 parent a32dc3d commit 2ca7b96

File tree

4 files changed

+34
-4
lines changed

4 files changed

+34
-4
lines changed

pkg/compose/build_bake.go

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

475497
func toBakeAttest(build types.BuildConfig) []string {
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ANOTHER_SECRET=zot

pkg/e2e/fixtures/build-test/secrets/Dockerfile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,7 @@ RUN diff /tmp/expected /tmp/actual
2424
RUN echo "bar" > /tmp/expected
2525
RUN --mount=type=secret,id=build_secret cat /run/secrets/build_secret > tmp/actual
2626
RUN diff --ignore-all-space /tmp/expected /tmp/actual
27+
28+
RUN echo "zot" > /tmp/expected
29+
RUN --mount=type=secret,id=dotenvsecret cat /run/secrets/dotenvsecret > tmp/actual
30+
RUN diff --ignore-all-space /tmp/expected /tmp/actual

pkg/e2e/fixtures/build-test/secrets/compose.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ services:
55
context: .
66
secrets:
77
- mysecret
8+
- dotenvsecret
89
- source: envsecret
910
target: build_secret
1011

@@ -13,3 +14,5 @@ secrets:
1314
file: ./secret.txt
1415
envsecret:
1516
environment: SOME_SECRET
17+
dotenvsecret:
18+
environment: ANOTHER_SECRET

0 commit comments

Comments
 (0)