GoogleContainerTools/skaffold · error · nsSettingErr

error converting to map[string]interface

Error message

error converting %s to map[string]interface{}

What it means

Skaffold's addOrUpdateNamespace sets metadata.namespace on each Kubernetes manifest. Before writing the namespace field it asserts the manifest's `metadata` value is a map[string]interface{} (as produced by yaml.Unmarshal). If metadata holds any other Go type (string, number, list, bool), the conversion fails and this error is returned wrapped by nsSettingErr.

Solutions

  1. Fix the manifest so `metadata:` is a mapping containing name/namespace fields
  2. Re-render the manifests (kustomize/helm) and verify with yamllint or `kubectl apply --dry-run=client` before running Skaffold
  3. If the document is not a real Kubernetes resource, exclude it from the manifest list passed to Skaffold

Example fix

# before
metadata: prod
kind: ConfigMap
# after
metadata:
  name: my-config
  namespace: prod
kind: ConfigMap
Defensive patterns

Strategy: type-guard

Validate before calling

var check map[string]interface{}
if err := yaml.Unmarshal(manifestBytes, &m); err != nil { return err }
if md, ok := m["metadata"].(map[string]interface{}); !ok && m["metadata"] != nil {
    return fmt.Errorf("metadata must be a mapping, got %T", m["metadata"])
}

Type guard

func isMetadataMap(m map[string]interface{}) bool {
    if md, ok := m["metadata"]; ok {
        _, ok := md.(map[string]interface{})
        return ok
    }
    return true
}

Prevention

When it happens

Trigger: Calling SetNamespace (directly or via namespace-transform of a ManifestList) on a manifest whose top-level `metadata:` key parses to a non-map YAML scalar or sequence, e.g. `metadata: my-ns` or `metadata: [a, b]`.

Common situations: Hand-written or generated YAML where metadata is accidentally a scalar; templating tools emitting malformed manifests; manifests with duplicate/odd keys parsed into unexpected types.

Related errors


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

Appendix: source

Thrown at pkg/skaffold/kubernetes/manifest/namespaces.go:127

		}
		updated = append(updated, updatedManifest)
	}

	log.Entry(context.TODO()).Debugln("manifests set with namespace", updated.String())
	return updated, nil
}

func addOrUpdateNamespace(manifest map[string]interface{}, ns string) error {
	originalMetadata, ok := manifest[metadataField]
	if !ok {
		metadataAdded := make(map[string]interface{})
		metadataAdded[namespaceField] = ns
		manifest[metadataField] = metadataAdded
		return nil
	}
	metadata, ok := originalMetadata.(map[string]interface{})
	if !ok {
		return nsSettingErr(fmt.Errorf("error converting %s to map[string]interface{}", originalMetadata))
	}
	nsValue, present := metadata[namespaceField]
	if !present || isEmptyOrEqual(nsValue, ns) {
		metadata[namespaceField] = ns
		return nil
	}

	if present && isEmptyOrEqual(ns, defaultNamespace) {
		return nil
	}

	warnings.Printf("a manifest already has namespace set \"%s\" which conflicts with namespace on the CLI \"%s\"", nsValue, ns)
	return nil
}

func isEmptyOrEqual(v interface{}, s string) bool {
	// check if namespace is set to empty string
	if v == nil {

View on GitHub (pinned to a1189de023)