Browse Source

refuse to publish compose file with local include

Signed-off-by: Nicolas De Loof <[email protected]>
Nicolas De Loof 9 months ago
parent
commit
bcd000ab40

+ 6 - 1
cmd/compose/publish.go

@@ -18,6 +18,7 @@ package compose
 
 import (
 	"context"
+	"errors"
 
 	"github.com/docker/cli/cli/command"
 	"github.com/spf13/cobra"
@@ -55,11 +56,15 @@ func publishCommand(p *ProjectOptions, dockerCli command.Cli, backend api.Servic
 }
 
 func runPublish(ctx context.Context, dockerCli command.Cli, backend api.Service, opts publishOptions, repository string) error {
-	project, _, err := opts.ToProject(ctx, dockerCli, nil)
+	project, metrics, err := opts.ToProject(ctx, dockerCli, nil)
 	if err != nil {
 		return err
 	}
 
+	if metrics.CountIncludesLocal > 0 {
+		return errors.New("cannot publish compose file with local includes")
+	}
+
 	return backend.Publish(ctx, project, repository, api.PublishOptions{
 		ResolveImageDigests: opts.resolveImageDigests,
 		OCIVersion:          api.OCIVersion(opts.ociVersion),

+ 3 - 0
pkg/e2e/fixtures/publish/another/compose.yml

@@ -0,0 +1,3 @@
+services:
+  foo:
+    image: bar

+ 6 - 0
pkg/e2e/fixtures/publish/compose-local-include.yml

@@ -0,0 +1,6 @@
+include:
+  - ./another/compose.yml
+
+services:
+  test:
+    image: test

+ 6 - 0
pkg/e2e/publish_test.go

@@ -116,4 +116,10 @@ FOO=bar`), res.Combined())
 		assert.Assert(t, strings.Contains(res.Combined(), "serviceA"), res.Combined())
 		assert.Assert(t, strings.Contains(res.Combined(), "serviceB"), res.Combined())
 	})
+
+	t.Run("refuse to publish with local include", func(t *testing.T) {
+		res := c.RunDockerComposeCmdNoCheck(t, "-f", "./fixtures/publish/compose-local-include.yml",
+			"-p", projectName, "alpha", "publish", "test/test", "--dry-run")
+		res.Assert(t, icmd.Expected{ExitCode: 1, Err: "cannot publish compose file with local includes"})
+	})
 }