GoogleContainerTools/skaffold · error

parsing image name %q: %w

Error message

parsing image name %q: %w

What it means

ExtractProjectID infers the GCP project ID from a container image name by parsing it as a registry reference and requiring the registry to be gcr.io, *.gcr.io, or *-docker.pkg.dev. If the image name cannot be parsed as a valid reference at all, it wraps the parse error with 'parsing image name'.

Source

Thrown at pkg/skaffold/gcp/projectid.go:31

See the License for the specific language governing permissions and
limitations under the License.
*/

package gcp

import (
	"fmt"
	"strings"

	"github.com/google/go-containerregistry/pkg/name"
)

// ExtractProjectID extracts the GCP projectID from a docker image name
// This only works if the imageName is pushed to gcr.io.
func ExtractProjectID(imageName string) (string, error) {
	ref, err := name.ParseReference(imageName, name.WeakValidation)
	if err != nil {
		return "", fmt.Errorf("parsing image name %q: %w", imageName, err)
	}

	registry := ref.Context().Registry.Name()
	if registry == "gcr.io" || strings.HasSuffix(registry, ".gcr.io") || strings.HasSuffix(registry, "-docker.pkg.dev") {
		parts := strings.Split(imageName, "/")
		if len(parts) >= 2 {
			return parts[1], nil
		}
	}

	return "", fmt.Errorf("unable to guess GCP projectID from image name [%s]", imageName)
}

View on GitHub (pinned to a1189de023)

Solutions

  1. Fix the image name to be a valid registry reference (e.g. gcr.io/project/name:tag).
  2. Remove any URL scheme ('https://') or stray port/characters from the string.
  3. Remember ExtractProjectID only works for gcr.io/*.gcr.io/*-docker.pkg.dev images — pass such an image or supply the project ID directly.
  4. Read the wrapped cause from go-containerregistry's name.ParseReference for the exact syntax problem.

Example fix

// before
projectID, _ := gcp.ExtractProjectID("https://gcr.io/my-proj/img")
// after
projectID, _ := gcp.ExtractProjectID("gcr.io/my-proj/img:latest")
Defensive patterns

Strategy: validation

Validate before calling

func isValidImageRef(imageName string) bool {
    _, err := name.ParseReference(imageName, name.WeakValidation)
    return err == nil
}
// call ExtractProjectID only if isValidImageRef(imageName)

Type guard

func isParseErr(err error) bool {
    return strings.Contains(err.Error(), "parsing image name")
}

Try / catch

projectID, err := gcp.ExtractProjectID(imageName)
if err != nil {
    if strings.Contains(err.Error(), "parsing image name") {
        return fmt.Errorf("fix image ref syntax %q: %w", imageName, err)
    }
    return err
}

Prevention

When it happens

Trigger: Calling ExtractProjectID with a malformed image string: missing tag/registry components, illegal characters, an empty string, or a full URL with scheme (https://) instead of an image reference.

Common situations: Passing a raw Docker image digest URL or an image built with an invalid tag; typos like double colons (name:tag:extra); accidentally passing 'docker.io/library/x' expecting a GCP project; using a local-only name like 'myapp' that go-containerregistry rejects as a reference.

Related errors


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