func updateConfig()

in container/go/pkg/compat/config.go [444:539]


func updateConfig(overrideInfo *OverrideConfigOpts) error {
	overrideInfo.ConfigFile.Author = overrideInfo.Author
	overrideInfo.ConfigFile.OS = overrideInfo.OperatingSystem
	overrideInfo.ConfigFile.Architecture = overrideInfo.Architecture
	if overrideInfo.OSVersion != "" {
		overrideInfo.ConfigFile.OSVersion = overrideInfo.Stamper.Stamp(overrideInfo.OSVersion)
	}

	creationTime, err := getCreationTime(overrideInfo)
	// creationTime is the RFC 3339 formatted time derived from createTime input.
	if err != nil {
		return errors.Wrap(err, "failed to parse creation time from config")
	}
	overrideInfo.ConfigFile.Created = v1.Time{creationTime}

	if overrideInfo.NullEntryPoint {
		overrideInfo.ConfigFile.Config.Entrypoint = nil
	} else if len(overrideInfo.Entrypoint) > 0 {
		overrideInfo.ConfigFile.Config.Entrypoint = overrideInfo.Stamper.StampAll(overrideInfo.Entrypoint)
	}

	if overrideInfo.NullCmd {
		overrideInfo.ConfigFile.Config.Cmd = nil
	} else if len(overrideInfo.Command) > 0 {
		overrideInfo.ConfigFile.Config.Cmd = overrideInfo.Stamper.StampAll(overrideInfo.Command)
	}
	if overrideInfo.User != "" {
		overrideInfo.ConfigFile.Config.User = overrideInfo.Stamper.Stamp(overrideInfo.User)
	}

	environMap, err := keyValueToMap(overrideInfo.Env)
	if err != nil {
		return errors.Wrapf(err, "error converting env array %v to map", overrideInfo.Env)
	}
	for k, v := range environMap {
		environMap[k] = overrideInfo.Stamper.Stamp(v)
	}
	// perform any substitutions of $VAR or ${VAR} with environment variables.
	if len(environMap) != 0 {
		overrideEnv, err := resolveEnvironment(overrideInfo, environMap)
		if err != nil {
			return errors.Wrap(err, "failed to parse environment variables from config")
		}
		overrideInfo.ConfigFile.Config.Env = overrideEnv
	}

	labels, err := resolveLabels(overrideInfo)
	if err != nil {
		return errors.Wrap(err, "failed to resolve labels from config")
	}
	if len(overrideInfo.LabelsArray) > 0 {
		labelsMap := updateConfigLabels(overrideInfo, labels)
		overrideInfo.ConfigFile.Config.Labels = labelsMap
	}

	if len(overrideInfo.Ports) > 0 {
		if len(overrideInfo.ConfigFile.Config.ExposedPorts) == 0 {
			overrideInfo.ConfigFile.Config.ExposedPorts = make(map[string]struct{})
		}
		if err := updateExposedPorts(overrideInfo); err != nil {
			return errors.Wrap(err, "failed to update exposed ports from config")
		}
	}

	if len(overrideInfo.Volumes) > 0 {
		if len(overrideInfo.ConfigFile.Config.Volumes) == 0 {
			overrideInfo.ConfigFile.Config.Volumes = make(map[string]struct{})
		}
		if err := updateVolumes(overrideInfo); err != nil {
			return errors.Wrap(err, "failed to update volumes from config")
		}
	}

	if overrideInfo.Workdir != "" {
		overrideInfo.ConfigFile.Config.WorkingDir = overrideInfo.Stamper.Stamp(overrideInfo.Workdir)
	}

	// layerDigests are diffIDs extracted from each layer file.
	layerDigests := []string{}
	for _, l := range overrideInfo.Layer {
		newLayer, err := extractValue(l)
		if err != nil {
			return errors.Wrap(err, "failed to extract the contents of layer file: %v")
		}
		layerDigests = append(layerDigests, newLayer)
	}
	if err := updateConfigLayers(overrideInfo, layerDigests, creationTime); err != nil {
		return errors.Wrap(err, "failed to correctly update layers from config")
	}

	if len(overrideInfo.EntrypointPrefix) != 0 {
		newEntrypoint := append(overrideInfo.EntrypointPrefix, overrideInfo.ConfigFile.Config.Entrypoint...)
		overrideInfo.ConfigFile.Config.Entrypoint = newEntrypoint
	}
	return nil
}