// insertEnvAfterFrom inserts an ENV instruction with the environment variables // from env after every FROM instruction in node. func insertEnvAfterFrom(node *parser.Node, env []kapi.EnvVar) error { if node == nil || len(env) == 0 { return nil } // Build ENV instruction. var m []dockerfile.KeyValue for _, e := range env { m = append(m, dockerfile.KeyValue{Key: e.Name, Value: e.Value}) } buildEnv, err := dockerfile.Env(m) if err != nil { return err } // Insert the buildEnv after every FROM instruction. // We iterate in reverse order, otherwise indices would have to be // recomputed after each step, because we're changing node in-place. indices := dockerfile.FindAll(node, dockercmd.From) for i := len(indices) - 1; i >= 0; i-- { err := dockerfile.InsertInstructions(node, indices[i]+1, buildEnv) if err != nil { return err } } return nil }
// appendKeyValueInstruction is a primitive used to avoid code duplication. // Callers should use a derivative of this such as appendEnv or appendLabel. // appendKeyValueInstruction appends a Dockerfile instruction with key-value // syntax created by f as the last child of node with keys and values from m. func appendKeyValueInstruction(f func([]dockerfile.KeyValue) (string, error), node *parser.Node, m []dockerfile.KeyValue) error { if node == nil { return nil } instruction, err := f(m) if err != nil { return err } return dockerfile.InsertInstructions(node, len(node.Children), instruction) }