diff --git a/compose/loader/loader.go b/compose/loader/loader.go index 2ccef7198d..7fbcde6720 100644 --- a/compose/loader/loader.go +++ b/compose/loader/loader.go @@ -427,9 +427,21 @@ func loadVolumes(source types.Dict) (map[string]types.VolumeConfig, error) { return volumes, err } for name, volume := range volumes { - if volume.External.External && volume.External.Name == "" { - volume.External.Name = name - volumes[name] = volume + if volume.External.External { + template := "conflicting parameters \"external\" and %q specified for volume %q" + if volume.Driver != "" { + return nil, fmt.Errorf(template, "driver", name) + } + if len(volume.DriverOpts) > 0 { + return nil, fmt.Errorf(template, "driver_opts", name) + } + if len(volume.Labels) > 0 { + return nil, fmt.Errorf(template, "labels", name) + } + if volume.External.Name == "" { + volume.External.Name = name + volumes[name] = volume + } } } return volumes, nil diff --git a/compose/loader/loader_test.go b/compose/loader/loader_test.go index 53f4280b64..afa2882c32 100644 --- a/compose/loader/loader_test.go +++ b/compose/loader/loader_test.go @@ -541,6 +541,50 @@ services: assert.Contains(t, forbidden, "extends") } +func TestInvalidExternalAndDriverCombination(t *testing.T) { + _, err := loadYAML(` +version: "3" +volumes: + external_volume: + external: true + driver: foobar +`) + + assert.Error(t, err) + assert.Contains(t, err.Error(), "conflicting parameters \"external\" and \"driver\" specified for volume") + assert.Contains(t, err.Error(), "external_volume") +} + +func TestInvalidExternalAndDirverOptsCombination(t *testing.T) { + _, err := loadYAML(` +version: "3" +volumes: + external_volume: + external: true + driver_opts: + beep: boop +`) + + assert.Error(t, err) + assert.Contains(t, err.Error(), "conflicting parameters \"external\" and \"driver_opts\" specified for volume") + assert.Contains(t, err.Error(), "external_volume") +} + +func TestInvalidExternalAndLabelsCombination(t *testing.T) { + _, err := loadYAML(` +version: "3" +volumes: + external_volume: + external: true + labels: + - beep=boop +`) + + assert.Error(t, err) + assert.Contains(t, err.Error(), "conflicting parameters \"external\" and \"labels\" specified for volume") + assert.Contains(t, err.Error(), "external_volume") +} + func durationPtr(value time.Duration) *time.Duration { return &value }