{"record":{"id":"6a72d030094dab51","repo":"GoogleContainerTools/skaffold","slug":"putting-build-arguments-w","errorCode":null,"errorMessage":"putting build arguments: %w","messagePattern":"putting build arguments: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/skaffold/docker/parse.go","lineNumber":104,"sourceCode":"func ReadCopyCmdsFromDockerfile(ctx context.Context, onlyLastImage bool, absDockerfilePath, workspace string, buildArgs map[string]*string, cfg Config) ([]FromTo, error) {\n\tr, err := os.ReadFile(absDockerfilePath)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tres, err := parser.Parse(bytes.NewReader(r))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"parsing dockerfile %q: %w\", absDockerfilePath, err)\n\t}\n\n\tif err := validateParsedDockerfile(bytes.NewReader(r), res); err != nil {\n\t\treturn nil, fmt.Errorf(\"parsing dockerfile %q: %w\", absDockerfilePath, err)\n\t}\n\n\tdockerfileLines := res.AST.Children\n\n\tif err := expandBuildArgs(dockerfileLines, buildArgs); err != nil {\n\t\treturn nil, fmt.Errorf(\"putting build arguments: %w\", err)\n\t}\n\n\tdockerfileLinesWithOnbuild, err := expandOnbuildInstructions(ctx, dockerfileLines, cfg)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tcpCmds, err := extractCopyCommands(ctx, dockerfileLinesWithOnbuild, onlyLastImage, cfg)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"listing copied files: %w\", err)\n\t}\n\n\treturn expandSrcGlobPatterns(workspace, cpCmds)\n}\n\nfunc ExtractOnlyCopyCommands(absDockerfilePath string) ([]FromTo, error) {\n\tr, err := os.ReadFile(absDockerfilePath)\n\tif err != nil {","sourceCodeStart":86,"sourceCodeEnd":122,"githubUrl":"https://github.com/GoogleContainerTools/skaffold/blob/a1189de023efc32d4b8e11f395acc678aa555011/pkg/skaffold/docker/parse.go#L86-L122","documentation":"expandBuildArgs evaluates the caller-supplied build args map as environment-style templates (util.EvaluateEnvTemplateMap) before substituting them into ARG instructions; when a value references an unset variable or uses malformed template syntax, this error wraps the failure. Skaffold cannot resolve which files COPY depends on without concrete ARG values.","triggerScenarios":"ReadCopyCmdsFromDockerfile called with buildArgs containing '${VAR}' where VAR is not set in the process environment, or containing invalid shell/template expansion syntax (unbalanced '${', bad default expansions like '${VAR:x}').","commonSituations":"CI environments missing an env var that exists on a developer machine; skaffold.yaml build args copied from a docker-compose file with unsupported interpolation syntax; a renamed environment variable upstream; quoting mistakes in skaffold.yaml that swallow a '$'.","solutions":["Set the missing environment variable in your shell/CI before invoking Skaffold","Provide a default in the Dockerfile itself: ARG MYVAR=default-value","Fix the template syntax in the build args (escape literal dollars as $$ or remove unbalanced braces)","Move the value out of a template expression and pass it as a plain literal build arg"],"exampleFix":"// before (skaffold.yaml)\nbuildArgs:\n  TAG: ${GIT_TAG}\n// after\nbuildArgs:\n  TAG: ${GIT_TAG:-dev}","handlingStrategy":"validation","validationCode":"func argsResolvable(buildArgs map[string]*string) error {\n    for k, v := range buildArgs {\n        if v == nil { continue }\n        if _, err := shell.Expand(*v, os.Getenv); err != nil {\n            return fmt.Errorf(\"build arg %q has invalid expansion: %w\", k, err)\n        }\n    }\n    return nil\n}\n// or pre-expand: for k, v := range buildArgs { if v != nil { e := os.ExpandEnv(*v); buildArgs[k] = &e } }","typeGuard":"func hasBalancedTemplate(s string) bool {\n    return strings.Count(s, \"${\") == strings.Count(s, \"}\")\n}","tryCatchPattern":"if err := skaffoldEval(buildArgs); err != nil {\n    if strings.Contains(err.Error(), \"unable to evaluate build args\") {\n        return fmt.Errorf(\"unset/malformed build arg; provide env var or default: %w\", err)\n    }\n    return err\n}","preventionTips":["Declare defaults in the Dockerfile: ARG MYVAR=default","Use ${VAR:-default} in skaffold.yaml build args for optional values","Export required variables in CI/IDE environments where Skaffold runs","Escape literal '$' as '$$' when a dollar sign is meant literally"],"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"}