{"record":{"id":"854022ae6e54ede2","repo":"hashicorp/nomad","slug":"failed-to-parse-infra-image-pull-timeout-duratio","errorCode":null,"errorMessage":"failed to parse 'infra_image_pull_timeout' duration: %v","messagePattern":"failed to parse 'infra_image_pull_timeout' duration: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"drivers/docker/config.go","lineNumber":820,"sourceCode":"\t\t}\n\t\td.config.GC.DanglingContainers.CreationGrace = dur\n\t}\n\n\tif len(d.config.PullActivityTimeout) > 0 {\n\t\tdur, err := time.ParseDuration(d.config.PullActivityTimeout)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to parse 'pull_activity_timeout' duration: %v\", err)\n\t\t}\n\t\tif dur < pullActivityTimeoutMinimum {\n\t\t\treturn fmt.Errorf(\"pull_activity_timeout is less than minimum, %v\", pullActivityTimeoutMinimum)\n\t\t}\n\t\td.config.pullActivityTimeoutDuration = dur\n\t}\n\n\tif d.config.InfraImagePullTimeout != \"\" {\n\t\tdur, err := time.ParseDuration(d.config.InfraImagePullTimeout)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to parse 'infra_image_pull_timeout' duration: %v\", err)\n\t\t}\n\t\td.config.infraImagePullTimeoutDuration = dur\n\t}\n\n\tif d.config.ImagePullTimeout != \"\" {\n\t\t_, err := time.ParseDuration(d.config.ImagePullTimeout)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to parse 'image_pull_timeout' duration: %v\", err)\n\t\t}\n\t}\n\n\tif err := validateAllowedNamespace(d.config.AllowedModes); err != nil {\n\t\treturn err\n\t}\n\td.config.allowRuntimes = make(map[string]struct{}, len(d.config.AllowRuntimesList))\n\tfor _, r := range d.config.AllowRuntimesList {\n\t\td.config.allowRuntimes[r] = struct{}{}\n\t}","sourceCodeStart":802,"sourceCodeEnd":838,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/drivers/docker/config.go#L802-L838","documentation":"All duration strings in the Docker driver config are validated in SetConfig via time.ParseDuration; any unparseable string produces a wrapped error of the form \"failed to parse '<option>' duration: %v\" naming the specific field. This is a docker plugin config-loading failure.","triggerScenarios":"Any client plugin docker duration field (image_delay, period, creation_grace, pull_activity_timeout, infra_image_pull_timeout) set to a string time.ParseDuration rejects, e.g. ISO-8601 \"PT30M\" or unitless values.","commonSituations":"Script-generated client configs missing units; ISO-8601 durations; environment-variable interpolation failures leaving empty or malformed values.","solutions":["Correct the offending duration string to Go syntax: number + unit (e.g. \"5m\").","Convert ISO-8601 durations (PT5M) to Go durations (5m).","Test the client config with nomad validate and read the error for the exact parse failure.","Ensure templating/env substitution produces final literal values."],"exampleFix":"// before\nimage_delay = \"PT30M\"\n// after\nimage_delay = \"30m\"","handlingStrategy":"validation","validationCode":"for name, s := range map[string]string{\n  \"image_delay\": cfg.ImageDelay,\n  \"pull_activity_timeout\": cfg.PullActivityTimeout,\n} {\n  if s == \"\" { continue }\n  if _, err := time.ParseDuration(s); err != nil {\n    return fmt.Errorf(\"%s invalid: %v\", name, err)\n  }\n}","typeGuard":null,"tryCatchPattern":"dur, err := time.ParseDuration(s)\nif err != nil {\n  return fmt.Errorf(\"failed to parse '%s' duration: %v\", name, err)\n}","preventionTips":["Adopt Go duration syntax (\"30m\", \"1h\") everywhere.","Convert ISO-8601 durations before use.","Run nomad validate on all client configs."],"tags":["docker","duration","config","nomad"],"backgroundTag":"invalid-duration-format","analyzedSha":"482b49bf1aec006f089bcfc7e632d8f6ac303e5e","analyzedAt":"2026-09-04T07:54:14.808Z","contentChangedAt":"2026-09-04T07:54:14.808Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}