@@ -261,7 +261,7 @@ func loadSections(filename string, config map[string]interface{}, configDetails
261261 return nil , err
262262 }
263263
264- cfg .Networks , err = LoadNetworks (getSection (config , "networks" ), configDetails . Version )
264+ cfg .Networks , err = LoadNetworks (getSection (config , "networks" ))
265265 if err != nil {
266266 return nil , err
267267 }
@@ -426,6 +426,14 @@ func formatInvalidKeyError(keyPrefix string, key interface{}) error {
426426func LoadServices (filename string , servicesDict map [string ]interface {}, workingDir string , lookupEnv template.Mapping , opts * Options ) ([]types.ServiceConfig , error ) {
427427 var services []types.ServiceConfig
428428
429+ x , ok := servicesDict ["extensions" ]
430+ if ok {
431+ // as a top-level attribute, "services" doesn't support extensions, and a service can be named `x-foo`
432+ for k , v := range x .(map [string ]interface {}) {
433+ servicesDict [k ] = v
434+ }
435+ }
436+
429437 for name := range servicesDict {
430438 serviceConfig , err := loadServiceWithExtends (filename , name , servicesDict , workingDir , lookupEnv , opts , & cycleTracker {})
431439 if err != nil {
@@ -620,7 +628,7 @@ func transformUlimits(data interface{}) (interface{}, error) {
620628
621629// LoadNetworks produces a NetworkConfig map from a compose file Dict
622630// the source Dict is not validated if directly used. Use Load() to enable validation
623- func LoadNetworks (source map [string ]interface {}, version string ) (map [string ]types.NetworkConfig , error ) {
631+ func LoadNetworks (source map [string ]interface {}) (map [string ]types.NetworkConfig , error ) {
624632 networks := make (map [string ]types.NetworkConfig )
625633 err := Transform (source , & networks )
626634 if err != nil {
0 commit comments