{"record":{"id":"d3cc4c5fafd73e6e","repo":"GoogleContainerTools/skaffold","slug":"unable-to-expand-dockerconfig-path-s","errorCode":null,"errorMessage":"unable to expand dockerConfig.path %s","messagePattern":"unable to expand dockerConfig\\.path (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/skaffold/schema/defaults/defaults.go","lineNumber":372,"sourceCode":"\tif cluster.DockerConfig == nil {\n\t\treturn nil\n\t}\n\n\trandom := \"\"\n\tif cluster.RandomDockerConfigSecret {\n\t\tuid, _ := uuid.NewUUID()\n\t\trandom = uid.String()\n\t}\n\n\tcluster.DockerConfig.SecretName = valueOrDefault(cluster.DockerConfig.SecretName, kaniko.DefaultDockerConfigSecretName+random)\n\n\tif cluster.DockerConfig.Path == \"\" {\n\t\treturn nil\n\t}\n\n\tabsPath, err := homedir.Expand(cluster.DockerConfig.Path)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"unable to expand dockerConfig.path %s\", cluster.DockerConfig.Path)\n\t}\n\n\tcluster.DockerConfig.Path = absPath\n\treturn nil\n}\n\nfunc defaultToKanikoArtifact(artifact *latest.Artifact) {\n\tif artifact.KanikoArtifact == nil {\n\t\tartifact.KanikoArtifact = &latest.KanikoArtifact{}\n\t}\n}\n\nfunc setKanikoArtifactDefaults(a *latest.KanikoArtifact) {\n\ta.Image = valueOrDefault(a.Image, kaniko.DefaultImage)\n\ta.DockerfilePath = valueOrDefault(a.DockerfilePath, constants.DefaultDockerfilePath)\n\ta.InitImage = valueOrDefault(a.InitImage, constants.DefaultBusyboxImage)\n\ta.DigestFile = valueOrDefault(a.DigestFile, constants.DefaultKanikoDigestFile)\n\tif a.Cache != nil {","sourceCodeStart":354,"sourceCodeEnd":390,"githubUrl":"https://github.com/GoogleContainerTools/skaffold/blob/a1189de023efc32d4b8e11f395acc678aa555011/pkg/skaffold/schema/defaults/defaults.go#L354-L390","documentation":"Skaffold failed to expand the `~` shorthand (or other home-relative path) in the cluster's `dockerConfig.path` value. During secret setup (setDefaultClusterDockerConfigSecret), homedir.Expand is called to convert `~/path` into an absolute path; if the home directory cannot be determined (e.g. HOME/USERPROFILE unset), expansion fails and this error is thrown before any cluster interaction.","triggerScenarios":"A skaffold.yaml cluster profile sets `cluster.dockerConfig.path` to a path starting with `~` (or a home-relative path), and homedir.Expand cannot resolve it because the HOME environment variable is missing or empty — common when running skaffold inside a container, CI job, or systemd service without HOME set.","commonSituations":"Running `skaffold` in a Docker/CI container where $HOME is not set; pointing dockerConfig.path at `~/.docker/config.json` in a service account context; typos in dockerConfig.path that rely on an unset env var; Kubernetes exec/remote environments with stripped environment variables.","solutions":["Ensure the HOME (or USERPROFILE on Windows) environment variable is set before running skaffold, e.g. `HOME=/root skaffold run`","Replace the `~` in dockerConfig.path with the explicit absolute path, e.g. `/home/user/.docker/config.json`","Verify the value in skaffold.yaml has no unintended `~` or missing env interpolation; use `${HOME}` style expansion if supported","Set dockerConfig.secretName instead of dockerConfig.path if the secret already exists in the cluster"],"exampleFix":"# before (skaffold.yaml)\ncluster:\n  dockerConfig:\n    path: ~/.docker/config.json\n# after (HOME may be unset in CI)\ncluster:\n  dockerConfig:\n    path: /home/ci/.docker/config.json","handlingStrategy":"validation","validationCode":"path := cluster.DockerConfig.Path\nif strings.HasPrefix(path, \"~\") && os.Getenv(\"HOME\") == \"\" {\n    return fmt.Errorf(\"dockerConfig.path uses ~ but HOME is not set\")\n}","typeGuard":"func homeExpandable(p string) bool {\n    if !strings.HasPrefix(p, \"~\") { return true }\n    _, err := os.UserHomeDir()\n    return err == nil\n}","tryCatchPattern":null,"preventionTips":["Use absolute paths in dockerConfig.path for CI/container environments","Always set HOME when running skaffold in containers or services","Prefer dockerConfig.secretName over dockerConfig.path when the secret is pre-created","Smoke-test skaffold config parsing with `skaffold diagnose` in each runtime environment"],"tags":["kubernetes","docker-config","configuration","path-expansion"],"backgroundTag":"home-directory-not-found","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"}