From 4b2666b9d67183540e5ec22855c74750a2752685 Mon Sep 17 00:00:00 2001 From: Jack Laxson Date: Sat, 18 May 2019 05:53:44 -0400 Subject: [PATCH] Change compose file handling to require valid service specifications Added the checks and some tests One of the tests wasn't valid docker-compose.yml, that's been changed. Bad config throws an error and has a test Signed-off-by: Jack Laxson --- bake/compose.go | 13 ++++++- bake/compose_test.go | 36 +++++++++++++++++++ .../examples/compose/docker-compose.yml | 1 + 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/bake/compose.go b/bake/compose.go index db33a8c9..77569349 100644 --- a/bake/compose.go +++ b/bake/compose.go @@ -1,6 +1,8 @@ package bake import ( + "fmt" + "github.com/docker/cli/cli/compose/loader" composetypes "github.com/docker/cli/cli/compose/types" ) @@ -33,7 +35,7 @@ func ParseCompose(dt []byte) (*Config, error) { var g Group for _, s := range cfg.Services { - g.Targets = append(g.Targets, s.Name) + var contextPathP *string if s.Build.Context != "" { contextPath := s.Build.Context @@ -44,6 +46,15 @@ func ParseCompose(dt []byte) (*Config, error) { dockerfilePath := s.Build.Dockerfile dockerfilePathP = &dockerfilePath } + // Check if there's actually a dockerfile mentioned + if dockerfilePathP == nil && contextPathP == nil { + // if not make sure they're setting an image or it's invalid d-c.yml + if s.Image == "" { + return nil, fmt.Errorf("Compose file invalid: Service %s has neither an image nor a build context specified. At least one must be provided.", s.Name) + } + break + } + g.Targets = append(g.Targets, s.Name) t := Target{ Context: contextPathP, Dockerfile: dockerfilePathP, diff --git a/bake/compose_test.go b/bake/compose_test.go index 2f367179..37bebb73 100644 --- a/bake/compose_test.go +++ b/bake/compose_test.go @@ -40,6 +40,22 @@ services: require.Equal(t, "123", c.Target["webapp"].Args["buildno"]) } +func TestNoBuildOutOfTreeService(t *testing.T) { + var dt = []byte(` +version: "3.7" + +services: + external: + image: "verycooldb:1337" + webapp: + build: ./db +`) + c, err := ParseCompose(dt) + require.NoError(t, err) + require.Equal(t, 1, len(c.Group)) + +} + func TestParseComposeTarget(t *testing.T) { var dt = []byte(` version: "3.7" @@ -47,9 +63,11 @@ version: "3.7" services: db: build: + context: ./db target: db webapp: build: + context: . target: webapp `) @@ -59,3 +77,21 @@ services: require.Equal(t, "db", *c.Target["db"].Target) require.Equal(t, "webapp", *c.Target["webapp"].Target) } + +func TestBogusCompose(t *testing.T) { + var dt = []byte(` +version: "3.7" + +services: + db: + build: + target: db + webapp: + build: + context: . + target: webapp +`) + + _, err := ParseCompose(dt) + require.Error(t, err) +} diff --git a/hack/demo-env/examples/compose/docker-compose.yml b/hack/demo-env/examples/compose/docker-compose.yml index b31c3515..f9b03d13 100644 --- a/hack/demo-env/examples/compose/docker-compose.yml +++ b/hack/demo-env/examples/compose/docker-compose.yml @@ -7,6 +7,7 @@ services: image: docker.io/tonistiigi/db webapp: build: + context: . dockerfile: Dockerfile.webapp args: buildno: 1 \ No newline at end of file