mirror of
https://github.com/docker/compose.git
synced 2025-09-23 17:57:49 +02:00
resolve secrets based on env var before executing bake
Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com>
This commit is contained in:
parent
a32dc3da72
commit
2ca7b96e33
@ -176,6 +176,18 @@ func (s *composeService) doBuildBake(ctx context.Context, project *types.Project
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// tmpSecrets stores secret set by environment variables, so we don't have to "pollute" bake process's environment
|
||||||
|
tmpSecrets, err := os.MkdirTemp("", "secrets")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
rerr := os.RemoveAll(tmpSecrets)
|
||||||
|
if rerr != nil {
|
||||||
|
logrus.Warnf("Failed to removed temporary secrets directory %s: %s", tmpSecrets, rerr.Error())
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
for serviceName, service := range project.Services {
|
for serviceName, service := range project.Services {
|
||||||
if service.Build == nil {
|
if service.Build == nil {
|
||||||
continue
|
continue
|
||||||
@ -231,6 +243,11 @@ func (s *composeService) doBuildBake(ctx context.Context, project *types.Project
|
|||||||
noCache := service.Build.NoCache || options.NoCache
|
noCache := service.Build.NoCache || options.NoCache
|
||||||
|
|
||||||
target := targets[serviceName]
|
target := targets[serviceName]
|
||||||
|
|
||||||
|
secrets, err := toBakeSecrets(project, build.Secrets, tmpSecrets)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
cfg.Targets[target] = bakeTarget{
|
cfg.Targets[target] = bakeTarget{
|
||||||
Context: build.Context,
|
Context: build.Context,
|
||||||
Contexts: additionalContexts(build.AdditionalContexts, targets),
|
Contexts: additionalContexts(build.AdditionalContexts, targets),
|
||||||
@ -245,7 +262,7 @@ func (s *composeService) doBuildBake(ctx context.Context, project *types.Project
|
|||||||
NetworkMode: build.Network,
|
NetworkMode: build.Network,
|
||||||
Platforms: build.Platforms,
|
Platforms: build.Platforms,
|
||||||
Target: build.Target,
|
Target: build.Target,
|
||||||
Secrets: toBakeSecrets(project, build.Secrets),
|
Secrets: secrets,
|
||||||
SSH: toBakeSSH(append(build.SSH, options.SSHs...)),
|
SSH: toBakeSSH(append(build.SSH, options.SSHs...)),
|
||||||
Pull: pull,
|
Pull: pull,
|
||||||
NoCache: noCache,
|
NoCache: noCache,
|
||||||
@ -454,7 +471,7 @@ func toBakeSSH(ssh types.SSHConfig) []string {
|
|||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
func toBakeSecrets(project *types.Project, secrets []types.ServiceSecretConfig) []string {
|
func toBakeSecrets(project *types.Project, secrets []types.ServiceSecretConfig, tmpSecrets string) ([]string, error) {
|
||||||
var s []string
|
var s []string
|
||||||
for _, ref := range secrets {
|
for _, ref := range secrets {
|
||||||
def := project.Secrets[ref.Source]
|
def := project.Secrets[ref.Source]
|
||||||
@ -464,12 +481,17 @@ func toBakeSecrets(project *types.Project, secrets []types.ServiceSecretConfig)
|
|||||||
}
|
}
|
||||||
switch {
|
switch {
|
||||||
case def.Environment != "":
|
case def.Environment != "":
|
||||||
s = append(s, fmt.Sprintf("id=%s,type=env,env=%s", target, def.Environment))
|
sf := filepath.Join(tmpSecrets, def.Environment)
|
||||||
|
err := os.WriteFile(sf, []byte(project.Environment[def.Environment]), 0o600)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
s = append(s, fmt.Sprintf("id=%s,type=file,src=%s", target, sf))
|
||||||
case def.File != "":
|
case def.File != "":
|
||||||
s = append(s, fmt.Sprintf("id=%s,type=file,src=%s", target, def.File))
|
s = append(s, fmt.Sprintf("id=%s,type=file,src=%s", target, def.File))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return s
|
return s, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func toBakeAttest(build types.BuildConfig) []string {
|
func toBakeAttest(build types.BuildConfig) []string {
|
||||||
|
1
pkg/e2e/fixtures/build-test/secrets/.env
Normal file
1
pkg/e2e/fixtures/build-test/secrets/.env
Normal file
@ -0,0 +1 @@
|
|||||||
|
ANOTHER_SECRET=zot
|
@ -24,3 +24,7 @@ RUN diff /tmp/expected /tmp/actual
|
|||||||
RUN echo "bar" > /tmp/expected
|
RUN echo "bar" > /tmp/expected
|
||||||
RUN --mount=type=secret,id=build_secret cat /run/secrets/build_secret > tmp/actual
|
RUN --mount=type=secret,id=build_secret cat /run/secrets/build_secret > tmp/actual
|
||||||
RUN diff --ignore-all-space /tmp/expected /tmp/actual
|
RUN diff --ignore-all-space /tmp/expected /tmp/actual
|
||||||
|
|
||||||
|
RUN echo "zot" > /tmp/expected
|
||||||
|
RUN --mount=type=secret,id=dotenvsecret cat /run/secrets/dotenvsecret > tmp/actual
|
||||||
|
RUN diff --ignore-all-space /tmp/expected /tmp/actual
|
||||||
|
@ -5,6 +5,7 @@ services:
|
|||||||
context: .
|
context: .
|
||||||
secrets:
|
secrets:
|
||||||
- mysecret
|
- mysecret
|
||||||
|
- dotenvsecret
|
||||||
- source: envsecret
|
- source: envsecret
|
||||||
target: build_secret
|
target: build_secret
|
||||||
|
|
||||||
@ -13,3 +14,5 @@ secrets:
|
|||||||
file: ./secret.txt
|
file: ./secret.txt
|
||||||
envsecret:
|
envsecret:
|
||||||
environment: SOME_SECRET
|
environment: SOME_SECRET
|
||||||
|
dotenvsecret:
|
||||||
|
environment: ANOTHER_SECRET
|
||||||
|
Loading…
x
Reference in New Issue
Block a user