MCPcopy Create free account
hub / github.com/docker/cli / mergeServices

Function mergeServices

cli/compose/loader/merge.go:57–100  ·  view source on GitHub ↗
(base, override []types.ServiceConfig)

Source from the content-addressed store, hash-verified

55}
56
57func mergeServices(base, override []types.ServiceConfig) ([]types.ServiceConfig, error) {
58 mergeOpts := []func(*mergo.Config){
59 mergo.WithAppendSlice,
60 mergo.WithOverride,
61 mergo.WithTransformers(&specials{m: map[reflect.Type]func(dst, src reflect.Value) error{
62 reflect.PointerTo(reflect.TypeFor[types.LoggingConfig]()): safelyMerge(mergeLoggingConfig),
63 reflect.TypeFor[[]types.ServicePortConfig](): mergeSlice(toServicePortConfigsMap, toServicePortConfigsSlice),
64 reflect.TypeFor[[]types.ServiceSecretConfig](): mergeSlice(toServiceSecretConfigsMap, toServiceSecretConfigsSlice),
65 reflect.TypeFor[[]types.ServiceConfigObjConfig](): mergeSlice(toServiceConfigObjConfigsMap, toSServiceConfigObjConfigsSlice),
66 reflect.PointerTo(reflect.TypeFor[types.UlimitsConfig]()): mergeUlimitsConfig,
67 reflect.TypeFor[[]types.ServiceVolumeConfig](): mergeSlice(toServiceVolumeConfigsMap, toServiceVolumeConfigsSlice),
68 reflect.TypeFor[types.ShellCommand](): mergeShellCommand,
69 reflect.PointerTo(reflect.TypeFor[types.ServiceNetworkConfig]()): mergeServiceNetworkConfig,
70 reflect.PointerTo(reflect.TypeFor[uint64]()): mergeUint64,
71 }}),
72 }
73
74 baseServices := make(map[string]types.ServiceConfig, len(base))
75 for _, s := range base {
76 baseServices[s.Name] = s
77 }
78
79 for _, overrideService := range override {
80 if baseService, ok := baseServices[overrideService.Name]; ok {
81 if err := mergo.Merge(&baseService, &overrideService, mergeOpts...); err != nil {
82 return nil, fmt.Errorf("cannot merge service %s: %w", overrideService.Name, err)
83 }
84 baseServices[overrideService.Name] = baseService
85 continue
86 }
87 baseServices[overrideService.Name] = overrideService
88 }
89
90 services := make([]types.ServiceConfig, 0, len(baseServices))
91 for _, baseService := range baseServices {
92 services = append(services, baseService)
93 }
94
95 slices.SortFunc(services, func(a, b types.ServiceConfig) int {
96 return cmp.Compare(a.Name, b.Name)
97 })
98
99 return services, nil
100}
101
102func toServiceSecretConfigsMap(s any) (map[any]any, error) {
103 secrets, ok := s.([]types.ServiceSecretConfig)

Callers 3

mergeFunction · 0.85

Calls 2

safelyMergeFunction · 0.85
mergeSliceFunction · 0.85

Used in the wild real call sites across dependent graphs

searching dependent graphs…