func mergeProject(p *Project, bytes []byte) (map[string]*ServiceConfig, error) { configs := make(map[string]*ServiceConfig) datas := make(rawServiceMap) if err := yaml.Unmarshal(bytes, &datas); err != nil { return nil, err } if err := interpolate(p.context.EnvironmentLookup, &datas); err != nil { return nil, err } for name, data := range datas { data, err := parse(p.context.ConfigLookup, p.context.EnvironmentLookup, p.File, data, datas) if err != nil { logrus.Errorf("Failed to parse service %s: %v", name, err) return nil, err } datas[name] = data } if err := utils.Convert(datas, &configs); err != nil { return nil, err } adjustValues(configs) return configs, nil }
func readEnvFile(configLookup ConfigLookup, inFile string, serviceData rawService) (rawService, error) { var config ServiceConfig if err := utils.Convert(serviceData, &config); err != nil { return nil, err } if len(config.EnvFile.Slice()) == 0 { return serviceData, nil } if configLookup == nil { return nil, fmt.Errorf("Can not use env_file in file %s no mechanism provided to load files", inFile) } vars := config.Environment.Slice() for i := len(config.EnvFile.Slice()) - 1; i >= 0; i-- { envFile := config.EnvFile.Slice()[i] content, _, err := configLookup.Lookup(envFile, inFile) if err != nil { return nil, err } if err != nil { return nil, err } scanner := bufio.NewScanner(bytes.NewBuffer(content)) for scanner.Scan() { line := strings.TrimSpace(scanner.Text()) key := strings.SplitAfter(line, "=")[0] found := false for _, v := range vars { if strings.HasPrefix(v, key) { found = true break } } if !found { vars = append(vars, line) } } if scanner.Err() != nil { return nil, scanner.Err() } } serviceData["environment"] = vars delete(serviceData, "env_file") return serviceData, nil }