diff --git a/loader/validate.go b/loader/validate.go index d8ab6197..e88d14b5 100644 --- a/loader/validate.go +++ b/loader/validate.go @@ -38,6 +38,12 @@ func checkConsistency(project *types.Project) error { } } + for dependedService := range s.DependsOn { + if _, err := project.GetService(dependedService); err != nil { + return errors.Wrap(errdefs.ErrInvalid, fmt.Sprintf("service %q depends on undefined service %s", s.Name, dependedService)) + } + } + if strings.HasPrefix(s.NetworkMode, types.ServicePrefix) { serviceName := s.NetworkMode[len(types.ServicePrefix):] if _, err := project.GetServices(serviceName); err != nil { diff --git a/loader/validate_test.go b/loader/validate_test.go index 6d423d21..58268b2e 100644 --- a/loader/validate_test.go +++ b/loader/validate_test.go @@ -184,3 +184,19 @@ func TestValidateSecret(t *testing.T) { assert.Error(t, err, "secret \"foo\" must declare either `file` or `environment`: invalid compose project") }) } + +func TestValidateDependsOn(t *testing.T) { + project := types.Project{ + Services: types.Services([]types.ServiceConfig{ + { + Name: "myservice", + Image: "scratch", + DependsOn: map[string]types.ServiceDependency{ + "missingservice": {}, + }, + }, + }), + } + err := checkConsistency(&project) + assert.Error(t, err, `service "myservice" depends on undefined service missingservice: invalid compose project`) +}