diff --git a/cli/compose/loader/loader.go b/cli/compose/loader/loader.go index d6f676429d..972395dd72 100644 --- a/cli/compose/loader/loader.go +++ b/cli/compose/loader/loader.go @@ -221,6 +221,7 @@ func createTransformHook() mapstructure.DecodeHookFuncType { reflect.TypeOf(types.Labels{}): transformMappingOrListFunc("=", false), reflect.TypeOf(types.MappingWithColon{}): transformMappingOrListFunc(":", false), reflect.TypeOf(types.ServiceVolumeConfig{}): transformServiceVolumeConfig, + reflect.TypeOf(types.BuildConfig{}): transformBuildConfig, } return func(_ reflect.Type, target reflect.Type, data interface{}) (interface{}, error) { @@ -563,6 +564,17 @@ func transformStringSourceMap(data interface{}) (interface{}, error) { } } +func transformBuildConfig(data interface{}) (interface{}, error) { + switch value := data.(type) { + case string: + return map[string]interface{}{"context": value}, nil + case map[string]interface{}: + return data, nil + default: + return data, errors.Errorf("invalid type %T for service build", value) + } +} + func transformServiceVolumeConfig(data interface{}) (interface{}, error) { switch value := data.(type) { case string: diff --git a/cli/compose/loader/loader_test.go b/cli/compose/loader/loader_test.go index 6429a42021..863714dff1 100644 --- a/cli/compose/loader/loader_test.go +++ b/cli/compose/loader/loader_test.go @@ -528,6 +528,26 @@ services: assert.Equal(t, []string{"build", "links"}, unsupported) } +func TestBuildProperties(t *testing.T) { + dict, err := ParseYAML([]byte(` +version: "3" +services: + web: + image: web + build: . + links: + - bar + db: + image: db + build: + context: ./db +`)) + require.NoError(t, err) + configDetails := buildConfigDetails(dict, nil) + _, err = Load(configDetails) + require.NoError(t, err) +} + func TestDeprecatedProperties(t *testing.T) { dict, err := ParseYAML([]byte(` version: "3"