diff --git a/pkg/compose/secrets.go b/pkg/compose/secrets.go index 4a38141a2..2ebaa0e6b 100644 --- a/pkg/compose/secrets.go +++ b/pkg/compose/secrets.go @@ -45,11 +45,15 @@ func (s *composeService) injectSecrets(ctx context.Context, project *types.Proje 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", file.Environment, file.Name) + content := file.Content + if content == "" { + env, ok := project.Environment[file.Environment] + if !ok { + return fmt.Errorf("environment variable %q required by secret %q is not set", file.Environment, file.Name) + } + content = env } - b, err := createTar(env, types.FileReferenceConfig(config)) + b, err := createTar(content, types.FileReferenceConfig(config)) if err != nil { return err } diff --git a/pkg/e2e/fixtures/env-secret/child/compose.yaml b/pkg/e2e/fixtures/env-secret/child/compose.yaml new file mode 100644 index 000000000..6e4ab8213 --- /dev/null +++ b/pkg/e2e/fixtures/env-secret/child/compose.yaml @@ -0,0 +1,10 @@ +services: + included: + image: alpine + secrets: + - my-secret + command: cat /run/secrets/my-secret + +secrets: + my-secret: + environment: 'MY_SECRET' diff --git a/pkg/e2e/fixtures/env-secret/compose.yaml b/pkg/e2e/fixtures/env-secret/compose.yaml index be801888f..51052d36d 100644 --- a/pkg/e2e/fixtures/env-secret/compose.yaml +++ b/pkg/e2e/fixtures/env-secret/compose.yaml @@ -1,3 +1,8 @@ +include: + - path: child/compose.yaml + env_file: + - secret.env + services: foo: image: alpine diff --git a/pkg/e2e/fixtures/env-secret/secret.env b/pkg/e2e/fixtures/env-secret/secret.env new file mode 100644 index 000000000..a195fd539 --- /dev/null +++ b/pkg/e2e/fixtures/env-secret/secret.env @@ -0,0 +1 @@ +MY_SECRET='this-is-secret' diff --git a/pkg/e2e/secrets_test.go b/pkg/e2e/secrets_test.go index 3b9daf100..3e3895112 100644 --- a/pkg/e2e/secrets_test.go +++ b/pkg/e2e/secrets_test.go @@ -41,3 +41,13 @@ func TestSecretFromEnv(t *testing.T) { res.Assert(t, icmd.Expected{Out: "-r--r----- 1 1005 1005"}) }) } + +func TestSecretFromInclude(t *testing.T) { + c := NewParallelCLI(t) + defer c.cleanupWithDown(t, "env-secret-include") + + t.Run("compose run", func(t *testing.T) { + res := c.RunDockerComposeCmd(t, "-f", "./fixtures/env-secret/compose.yaml", "run", "included") + res.Assert(t, icmd.Expected{Out: "this-is-secret"}) + }) +}