Kaynağa Gözat

Fix configs are mounted under /<id>

Signed-off-by: Nicolas De Loof <[email protected]>
Nicolas De Loof 1 yıl önce
ebeveyn
işleme
59f11ecbeb

+ 20 - 17
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(),

+ 8 - 0
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"})
+	})
 }

+ 7 - 3
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