From 59f11ecbeb856f91440bbaf338f78c146d22934c Mon Sep 17 00:00:00 2001 From: Nicolas De Loof Date: Wed, 29 Nov 2023 14:21:39 +0100 Subject: [PATCH] Fix configs are mounted under / Signed-off-by: Nicolas De Loof --- pkg/compose/secrets.go | 37 +++++++++++++++------------ pkg/e2e/configs_test.go | 8 ++++++ pkg/e2e/fixtures/configs/compose.yaml | 10 +++++--- 3 files changed, 35 insertions(+), 20 deletions(-) diff --git a/pkg/compose/secrets.go b/pkg/compose/secrets.go index 96eb1b95c..e5570d320 100644 --- a/pkg/compose/secrets.go +++ b/pkg/compose/secrets.go @@ -30,14 +30,20 @@ import ( func (s *composeService) injectSecrets(ctx context.Context, project *types.Project, service types.ServiceConfig, id string) error { for _, config := range service.Secrets { - secret := project.Secrets[config.Source] - if secret.Environment == "" { + file := project.Secrets[config.Source] + if file.Environment == "" { continue } - env, ok := project.Environment[secret.Environment] + if config.Target == "" { + config.Target = "/run/secrets/" + config.Source + } else if !isAbsTarget(config.Target) { + config.Target = "/run/secrets/" + config.Target + } + + env, ok := project.Environment[file.Environment] if !ok { - return fmt.Errorf("environment variable %q required by secret %q is not set", secret.Environment, secret.Name) + return fmt.Errorf("environment variable %q required by file %q is not set", file.Environment, file.Name) } b, err := createTar(env, types.FileReferenceConfig(config)) if err != nil { @@ -56,12 +62,12 @@ func (s *composeService) injectSecrets(ctx context.Context, project *types.Proje func (s *composeService) injectConfigs(ctx context.Context, project *types.Project, service types.ServiceConfig, id string) error { for _, config := range service.Configs { - secret := project.Configs[config.Source] - content := secret.Content - if secret.Environment != "" { - env, ok := project.Environment[secret.Environment] + file := project.Configs[config.Source] + content := file.Content + if file.Environment != "" { + env, ok := project.Environment[file.Environment] if !ok { - return fmt.Errorf("environment variable %q required by secret %q is not set", secret.Environment, secret.Name) + return fmt.Errorf("environment variable %q required by file %q is not set", file.Environment, file.Name) } content = env } @@ -69,6 +75,10 @@ func (s *composeService) injectConfigs(ctx context.Context, project *types.Proje continue } + if config.Target == "" { + config.Target = "/" + config.Source + } + b, err := createTar(content, types.FileReferenceConfig(config)) if err != nil { return err @@ -93,13 +103,6 @@ func createTar(env string, config types.FileReferenceConfig) (bytes.Buffer, erro mode = *config.Mode } - target := config.Target - if config.Target == "" { - target = "/run/secrets/" + config.Source - } else if !isAbsTarget(config.Target) { - target = "/run/secrets/" + config.Target - } - var uid, gid int if config.UID != "" { v, err := strconv.Atoi(config.UID) @@ -117,7 +120,7 @@ func createTar(env string, config types.FileReferenceConfig) (bytes.Buffer, erro } header := &tar.Header{ - Name: target, + Name: config.Target, Size: int64(len(value)), Mode: int64(mode), ModTime: time.Now(), diff --git a/pkg/e2e/configs_test.go b/pkg/e2e/configs_test.go index a3c429628..8d7dc9c0e 100644 --- a/pkg/e2e/configs_test.go +++ b/pkg/e2e/configs_test.go @@ -45,4 +45,12 @@ func TestConfigFromEnv(t *testing.T) { }) res.Assert(t, icmd.Expected{Out: "This is my config"}) }) + + t.Run("custom target", func(t *testing.T) { + res := icmd.RunCmd(c.NewDockerComposeCmd(t, "-f", "./fixtures/configs/compose.yaml", "run", "target"), + func(cmd *icmd.Cmd) { + cmd.Env = append(cmd.Env, "CONFIG=config") + }) + res.Assert(t, icmd.Expected{Out: "This is my config"}) + }) } diff --git a/pkg/e2e/fixtures/configs/compose.yaml b/pkg/e2e/fixtures/configs/compose.yaml index 9286d6f4e..34d4827dd 100644 --- a/pkg/e2e/fixtures/configs/compose.yaml +++ b/pkg/e2e/fixtures/configs/compose.yaml @@ -3,23 +3,27 @@ services: image: alpine configs: - source: from_env - target: /from_env command: cat /from_env from_file: image: alpine configs: - source: from_file - target: /from_file command: cat /from_file inlined: image: alpine configs: - source: inlined - target: /inlined command: cat /inlined + target: + image: alpine + configs: + - source: inlined + target: /target + command: cat /target + configs: from_env: environment: CONFIG