{"record":{"id":"45d5975f38a12ae1","repo":"docker/cli","slug":"cannot-merge-networks-w","errorCode":null,"errorMessage":"cannot merge networks: %w","messagePattern":"cannot merge networks: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cli/compose/loader/merge.go","lineNumber":42,"sourceCode":"\t\treturn fn\n\t}\n\treturn nil\n}\n\nfunc merge(configs []*types.Config) (*types.Config, error) {\n\tbase := configs[0]\n\tfor _, override := range configs[1:] {\n\t\tvar errs []error\n\t\tif services, err := mergeServices(base.Services, override.Services); err != nil {\n\t\t\terrs = append(errs, fmt.Errorf(\"cannot merge services: %w\", err))\n\t\t} else {\n\t\t\tbase.Services = services\n\t\t}\n\t\tif err := mergo.Map(&base.Volumes, &override.Volumes, mergo.WithOverride); err != nil {\n\t\t\terrs = append(errs, fmt.Errorf(\"cannot merge volumes: %w\", err))\n\t\t}\n\t\tif err := mergo.Map(&base.Networks, &override.Networks, mergo.WithOverride); err != nil {\n\t\t\terrs = append(errs, fmt.Errorf(\"cannot merge networks: %w\", err))\n\t\t}\n\t\tif err := mergo.Map(&base.Secrets, &override.Secrets, mergo.WithOverride); err != nil {\n\t\t\terrs = append(errs, fmt.Errorf(\"cannot merge secrets: %w\", err))\n\t\t}\n\t\tif err := mergo.Map(&base.Configs, &override.Configs, mergo.WithOverride); err != nil {\n\t\t\terrs = append(errs, fmt.Errorf(\"cannot merge configs: %w\", err))\n\t\t}\n\t\tif err := errors.Join(errs...); err != nil {\n\t\t\treturn nil, errors.Join(fmt.Errorf(\"failed to merge file %s\", override.Filename), err)\n\t\t}\n\t}\n\treturn base, nil\n}\n\nfunc mergeServices(base, override []types.ServiceConfig) ([]types.ServiceConfig, error) {\n\tmergeOpts := []func(*mergo.Config){\n\t\tmergo.WithAppendSlice,\n\t\tmergo.WithOverride,","sourceCodeStart":24,"sourceCodeEnd":60,"githubUrl":"https://github.com/docker/cli/blob/4f84911bfe8811e9b028e4b1fee8e7510be79387/cli/compose/loader/merge.go#L24-L60","documentation":"Thrown by merge() when mergo.Map fails merging the `Networks` maps of two compose Configs. Analogous to the volumes case: merges map[string]NetworkConfig by key and surfaces a mergo error on incompatible values.","triggerScenarios":"Merging two compose files where the Networks map merge raises a mergo error — typically when override and base define the same network name with structurally incompatible config.","commonSituations":"One file makes a network external, another defines it with driver/labels; mixing attachable/enable_ipv6 differently across overrides.","solutions":["Inspect the wrapped `%w` cause for the offending network key.","Align the network definition across all `-f` files (external vs managed, same driver).","Override only scalar fields (name, driver) rather than flipping external on/off across files."],"exampleFix":"# before\n# base.yml\nnetworks:\n  appnet:\n    driver: bridge\n# override.yml\nnetworks:\n  appnet:\n    external: true\n# after\nnetworks:\n  appnet:\n    driver: bridge","handlingStrategy":"try-catch","validationCode":"// Ensure networks with the same key are structurally compatible before merge.\nfunc validateMergeableNetworks(base, override map[string]types.NetworkConfig) error {\n    for k, ov := range override {\n        bv, ok := base[k]\n        if !ok {\n            continue\n        }\n        if bv.External.External != ov.External.External {\n            return fmt.Errorf(\"network %s: external flag differs across files\", k)\n        }\n    }\n    return nil\n}","typeGuard":null,"tryCatchPattern":"// Surface the wrapped mergo cause clearly.\nif err := cfg.Load(details); err != nil {\n    var me interface{ Unwrap() error }\n    if errors.As(err, &me) {\n        return fmt.Errorf(\"network merge failed: %w\", me.Unwrap())\n    }\n    return err\n}","preventionTips":["Don't toggle a network between external and managed across override files.","Keep driver/IPAM config consistent for shared network keys.","Preview the merge with `docker compose config`."],"tags":["compose","merge","override","network"],"backgroundTag":null,"analyzedSha":"4f84911bfe8811e9b028e4b1fee8e7510be79387","analyzedAt":"2026-08-07T12:15:29.814Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}