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
}