in image.go [80:146]
func MergeImageConfig(dst *DockerImageConfig, src *ImageConfig) error {
if src == nil {
return nil
}
if src.Entrypoint != "" {
split, err := shlex.Split(src.Entrypoint)
if err != nil {
return errors.Wrap(err, "error splitting entrypoint into args")
}
dst.Entrypoint = split
// Reset cmd as this may be totally invalid now
// This is the same behavior as the Dockerfile frontend
dst.Cmd = nil
}
if src.Cmd != "" {
split, err := shlex.Split(src.Cmd)
if err != nil {
return errors.Wrap(err, "error splitting cmd into args")
}
dst.Cmd = split
}
if len(src.Env) > 0 {
// Env is append only
// If the env var already exists, replace it
envIdx := make(map[string]int)
for i, env := range dst.Env {
envIdx[env] = i
}
for _, env := range src.Env {
if idx, ok := envIdx[env]; ok {
dst.Env[idx] = env
} else {
dst.Env = append(dst.Env, env)
}
}
}
if src.WorkingDir != "" {
dst.WorkingDir = src.WorkingDir
}
if src.StopSignal != "" {
dst.StopSignal = src.StopSignal
}
if src.User != "" {
dst.User = src.User
}
for k, v := range src.Volumes {
if dst.Volumes == nil {
dst.Volumes = make(map[string]struct{}, len(src.Volumes))
}
dst.Volumes[k] = v
}
for k, v := range src.Labels {
if dst.Labels == nil {
dst.Labels = make(map[string]string, len(src.Labels))
}
dst.Labels[k] = v
}
return nil
}