GoogleContainerTools/skaffold · error

reading config file: %w

Error message

reading config file: %w

What it means

When `skaffold fix --overwrite` writes the upgraded config, it first backs up the existing file by reading it with os.ReadFile. This error wraps a failure to read the current skaffold.yaml. It means the source config file could not be read at backup time — typically a permissions problem or the file disappeared between parse and backup.

Source

Thrown at cmd/skaffold/app/cmd/fix.go:126

			cfgs = append(cfgs, &parser.SkaffoldConfigEntry{
				SkaffoldConfig: cpCfg.(*latest.SkaffoldConfig),
				SourceFile:     configFile,
				IsRootConfig:   true})
		}
		if err := validation.Process(cfgs, validation.GetValidationOpts(opts)); err != nil {
			return fmt.Errorf("validating upgraded config: %w", err)
		}
	}
	newCfg, err := yaml.MarshalWithSeparator(upgraded)
	if err != nil {
		return fmt.Errorf("marshaling new config: %w", err)
	}
	if outFile != "" {
		var writeErr error
		if overwrite {
			oldCfg, readErr := os.ReadFile(configFile)
			if readErr != nil {
				return fmt.Errorf("reading config file: %w", readErr)
			}
			newFile := fmt.Sprintf("%s.v2", outFile)

			writeErr = os.WriteFile(newFile, oldCfg, 0644)
			if writeErr == nil {
				output.Default.Fprintln(out, "Backed up previous skaffold.yaml at ", newFile)
			}
		}
		if err := os.WriteFile(outFile, newCfg, 0644); err != nil {
			return fmt.Errorf("writing config file: %w", err)
		}
		output.Default.Fprintf(out, "New config at version %s generated and written to %s\n", toVersion, outFile)
		if writeErr != nil {
			output.Yellow.Fprintln(out, "Error moving old config. Dumping old v2 config on stdout:")
			output.Default.Fprintln(out, getOldConfigYaml(versionedCfgs))
		}
	} else {
		out.Write(newCfg)

View on GitHub (pinned to a1189de023)

Solutions

  1. Verify the file exists and is readable: `ls -l skaffold.yaml` (or the path passed to -f).
  2. Fix permissions so the current user can read the file (`chmod u+r`).
  3. Re-check the `-f`/`--filename` flag value for typos.
  4. Skip the overwrite backup path by writing to a new file with `--output` instead of `--overwrite`.

Example fix

// before
skaffold fix --overwrite -f ./skafflod.yaml
// after: correct path with read permission
chmod u+r skaffold.yaml
skaffold fix --overwrite -f ./skaffold.yaml
Defensive patterns

Strategy: validation

Validate before calling

// Pre-check readability of the config file before invoking skaffold fix --overwrite
const fs = require('fs');
const path = 'skaffold.yaml';
fs.accessSync(path, fs.constants.R_OK); // throws EACCES/ENOENT early with a clear message
if (!fs.statSync(path).isFile()) throw new Error(`${path} is not a regular file`);

Try / catch

try {
  execFileSync('skaffold', ['fix', '--overwrite', '-f', configPath]);
} catch (e) {
  const msg = e.stderr?.toString() ?? '';
  if (msg.includes('reading config file')) {
    console.error(`Cannot read ${configPath}: check existence and read permissions.`);
  } else throw e;
}

Prevention

When it happens

Trigger: `os.ReadFile(configFile)` fails during the overwrite branch of `skaffold fix --overwrite` — e.g. the -f flag points to a file that no longer exists, or the process lacks read permission on it.

Common situations: Running skaffold as a different user without read access to skaffold.yaml; pointing `-f` at a path with a typo that somehow passed earlier parsing; deleting/moving the file while fix runs.

Related errors


AI-assisted analysis of GoogleContainerTools/skaffold@a1189de023 (2026-09-05). Data as JSON: /api/errors/9b08f9139578279e. Report an issue: GitHub.