Skip to content

Commit 40063b4

Browse files
authored
Merge pull request docker#9615 from glours/use-env-secret-on-build
add support of environment secret during build step
2 parents 83744f7 + 4debb13 commit 40063b4

File tree

4 files changed

+42
-15
lines changed

4 files changed

+42
-15
lines changed

pkg/compose/build.go

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -256,23 +256,11 @@ func (s *composeService) toBuildOptions(project *types.Project, service types.Se
256256
}
257257

258258
if len(service.Build.Secrets) > 0 {
259-
var sources []secretsprovider.Source
260-
for _, secret := range service.Build.Secrets {
261-
config := project.Secrets[secret.Source]
262-
if config.File == "" {
263-
return build.Options{}, fmt.Errorf("build.secrets only supports file-based secrets: %q", secret.Source)
264-
}
265-
sources = append(sources, secretsprovider.Source{
266-
ID: secret.Source,
267-
FilePath: config.File,
268-
})
269-
}
270-
store, err := secretsprovider.NewStore(sources)
259+
secretsProvider, err := addSecretsConfig(project, service, sessionConfig)
271260
if err != nil {
272261
return build.Options{}, err
273262
}
274-
p := secretsprovider.NewSecretProvider(store)
275-
sessionConfig = append(sessionConfig, p)
263+
sessionConfig = append(sessionConfig, secretsProvider)
276264
}
277265

278266
if len(service.Build.Tags) > 0 {
@@ -341,3 +329,30 @@ func sshAgentProvider(sshKeys types.SSHConfig) (session.Attachable, error) {
341329
}
342330
return sshprovider.NewSSHAgentProvider(sshConfig)
343331
}
332+
333+
func addSecretsConfig(project *types.Project, service types.ServiceConfig, sessionConfig []session.Attachable) (session.Attachable, error) {
334+
335+
var sources []secretsprovider.Source
336+
for _, secret := range service.Build.Secrets {
337+
config := project.Secrets[secret.Source]
338+
switch {
339+
case config.File != "":
340+
sources = append(sources, secretsprovider.Source{
341+
ID: secret.Source,
342+
FilePath: config.File,
343+
})
344+
case config.Environment != "":
345+
sources = append(sources, secretsprovider.Source{
346+
ID: secret.Source,
347+
Env: config.Environment,
348+
})
349+
default:
350+
return nil, fmt.Errorf("build.secrets only supports environment or file-based secrets: %q", secret.Source)
351+
}
352+
}
353+
store, err := secretsprovider.NewStore(sources)
354+
if err != nil {
355+
return nil, err
356+
}
357+
return secretsprovider.NewSecretProvider(store), nil
358+
}

pkg/e2e/build_test.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,12 @@ func TestBuildSecrets(t *testing.T) {
176176
// ensure local test run does not reuse previously build image
177177
c.RunDockerOrExitError(t, "rmi", "build-test-secret")
178178

179-
res := c.RunDockerComposeCmd(t, "--project-directory", "fixtures/build-test/secrets", "build")
179+
cmd := c.NewDockerComposeCmd(t, "--project-directory", "fixtures/build-test/secrets", "build")
180+
181+
res := icmd.RunCmd(cmd, func(cmd *icmd.Cmd) {
182+
cmd.Env = append(cmd.Env, "SOME_SECRET=bar")
183+
})
184+
180185
res.Assert(t, icmd.Success)
181186
})
182187
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,7 @@ FROM alpine
2020
RUN echo "foo" > /tmp/expected
2121
RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret > /tmp/actual
2222
RUN diff /tmp/expected /tmp/actual
23+
24+
RUN echo "bar" > /tmp/expected
25+
RUN --mount=type=secret,id=envsecret cat /run/secrets/envsecret > tmp/actual
26+
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,7 +5,10 @@ services:
55
context: .
66
secrets:
77
- mysecret
8+
- envsecret
89

910
secrets:
1011
mysecret:
1112
file: ./secret.txt
13+
envsecret:
14+
environment: SOME_SECRET

0 commit comments

Comments
 (0)