{"record":{"id":"55f2cd02e7923595","repo":"GoogleContainerTools/skaffold","slug":"unable-to-evaluate-build-args-w-55f2cd","errorCode":null,"errorMessage":"unable to evaluate build args: %w","messagePattern":"unable to evaluate build args: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/skaffold/docker/parse.go","lineNumber":174,"sourceCode":"\t\treturn nil, fmt.Errorf(\"parsing dockerfile: %w\", err)\n\t}\n\tm := make(map[string]*string)\n\tfor _, n := range res.AST.Children {\n\t\tif strings.ToLower(n.Value) != command.Arg {\n\t\t\tcontinue\n\t\t}\n\t\tk := strings.SplitN(n.Next.Value, \"=\", 2)[0]\n\t\tif v, ok := buildArgs[k]; ok {\n\t\t\tm[k] = v\n\t\t}\n\t}\n\treturn m, nil\n}\n\nfunc expandBuildArgs(nodes []*parser.Node, buildArgs map[string]*string) error {\n\targs, err := util.EvaluateEnvTemplateMap(buildArgs)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"unable to evaluate build args: %w\", err)\n\t}\n\n\tfor i, node := range nodes {\n\t\tif strings.ToLower(node.Value) != command.Arg {\n\t\t\tcontinue\n\t\t}\n\n\t\t// build arg's key\n\t\tkeyValue := strings.Split(node.Next.Value, \"=\")\n\t\tkey := keyValue[0]\n\n\t\t// build arg's value\n\t\tvar value string\n\t\tif args[key] != nil {\n\t\t\tvalue = *args[key]\n\t\t} else if len(keyValue) > 1 {\n\t\t\tvalue = keyValue[1]\n\t\t}","sourceCodeStart":156,"sourceCodeEnd":192,"githubUrl":"https://github.com/GoogleContainerTools/skaffold/blob/a1189de023efc32d4b8e11f395acc678aa555011/pkg/skaffold/docker/parse.go#L156-L192","documentation":"expandBuildArgs first evaluates all user-supplied build args as env-style templates; any failure (unset referenced variable, malformed ${...} expression) is wrapped as 'unable to evaluate build args'. Called directly from ReadCopyCmdsFromDockerfile, so dependency extraction stops before ARG substitution into the AST.","triggerScenarios":"ReadCopyCmdsFromDockerfile called with a buildArgs map where a value like '$UNSET_VAR' or '${A:-${B}}' cannot be resolved by util.EvaluateEnvTemplateMap against the process environment.","commonSituations":"Local shell has the variable but the Skaffold process (IDE plugin, container, CI job) does not; nested or escaped dollar signs mangled by yaml/shell quoting layers; typos in variable names.","solutions":["Export the referenced variable in the environment where Skaffold runs","Add a fallback default in the arg value ('${VAR:-fallback}') or in the Dockerfile ARG declaration","Fix unbalanced braces / invalid expansion syntax in the build-arg value","Log or print util.EvaluateEnvTemplateMap's inner error to identify exactly which key failed and correct it"],"exampleFix":"// before\nbuildArgs:\n  VERSION: $APP_VERSION\n// after\nbuildArgs:\n  VERSION: ${APP_VERSION:-0.0.0}","handlingStrategy":"validation","validationCode":"func preflightBuildArgs(buildArgs map[string]*string, env func(string) string) error {\n    for k, v := range buildArgs {\n        if v == nil { continue }\n        for _, m := range varRefRe.FindAllStringSubmatch(*v, -1) {\n            name := m[1]\n            if !strings.Contains(*v, \":-\"+name) && env(name) == \"\" {\n                return fmt.Errorf(\"build arg %q references unset env var %q\", k, name)\n            }\n        }\n    }\n    return nil\n}\nvar varRefRe = regexp.MustCompile(`\\$\\{?([A-Za-z_][A-Za-z0-9_]*)\\}?`)","typeGuard":"func allArgsEvaluate(buildArgs map[string]*string) bool {\n    _, err := util.EvaluateEnvTemplateMap(buildArgs)\n    return err == nil\n}","tryCatchPattern":"err := skaffoldExpandArgs(nodes, buildArgs)\nif err != nil && strings.Contains(err.Error(), \"unable to evaluate build args\") {\n    for k, v := range buildArgs {\n        if v == nil || !hasBalancedTemplate(*v) || referencesUnsetEnv(*v) {\n            log.Printf(\"problematic build arg %s=%v\", k, v)\n        }\n    }\n    return err\n}","preventionTips":["Mirror CI env vars locally when reproducing — the failure is usually environment-dependent","Always give Dockerfile ARGs defaults so missing env vars degrade gracefully","Evaluate build args yourself (util.EvaluateEnvTemplateMap) as a preflight to identify the failing key","Watch for shell/yaml layers stripping '$' or braces from arg values"],"tags":["build-args","template","environment"],"backgroundTag":"build-args-evaluation-failed","analyzedSha":"a1189de023efc32d4b8e11f395acc678aa555011","analyzedAt":"2026-09-05T12:09:27.064Z","contentChangedAt":"2026-09-05T12:09:27.064Z","schemaVersion":2},"datasetVersion":"2026-09-12T17:17:11.597Z"}