goreleaser/goreleaser · error

invalid tags: %w

Error message

invalid tags: %w

What it means

makeArgs renders the `tags` list as Go templates with a non-empty constraint. This error wraps any failure applying the templates in config.DockerV2.Tags. (Note: an empty tag list after rendering produces the separate 'no tags provided' error instead.)

Source

Thrown at internal/pipe/docker/v2/docker.go:370

			WithError(err).
			Debug("could not resolve base image")
	}

	tpl = tpl.WithExtraFields(tmpl.Fields{
		keyBaseImage:       baseImg.name,
		keyBaseImageDigest: baseImg.digest,
	})

	images, err := tpl.Slice(d.Images, tmpl.NonEmpty())
	if err != nil {
		return dockerArgs{}, fmt.Errorf("invalid images: %w", err)
	}
	if len(images) == 0 {
		return dockerArgs{}, pipe.Skip("no images")
	}
	tags, err := tpl.Slice(d.Tags, tmpl.NonEmpty())
	if err != nil {
		return dockerArgs{}, fmt.Errorf("invalid tags: %w", err)
	}
	if len(tags) == 0 {
		return dockerArgs{}, errors.New("no tags provided")
	}
	// Append the -platform bit to non-empty tags.
	if len(d.Platforms) == 1 && ctx.Snapshot {
		suffix := tagSuffix(d.Platforms[0])
		for j := range tags {
			tags[j] += "-" + suffix
		}
	}
	allImages := makeImageList(images, tags)

	labelFlags, err := tplMapFlags(tpl, "--label", d.Labels)
	if err != nil {
		return dockerArgs{}, fmt.Errorf("invalid labels: %w", err)
	}

View on GitHub (pinned to f5edd73956)

Solutions

  1. Fix the template expression in the offending `dockers_v2.tags` entry.
  2. Use built-in fields like `{{.Version}}`, `{{.Tag}}`, `{{.Major}}.{{.Minor}}` that are known to exist.
  3. Simplify to literal tags (latest, '{{.Version}}') if conditional templating is not required.
  4. Test rendering with `goreleaser release --snapshot --clean`.

Example fix

// before
dockers_v2:
  - tags:
      - "{{.Vers}}"
// after
dockers_v2:
  - tags:
      - "{{.Version}}"
      - latest
Defensive patterns

Strategy: validation

Validate before calling

// Go: pre-render tags like makeArgs does
for _, d := range cfg.DockersV2 {
    tags, err := tmpl.New(ctx).Slice(d.Tags, tmpl.NonEmpty())
    if err != nil {
        return fmt.Errorf("invalid tags template: %w", err)
    }
}

Type guard

func tagsValid(ctx *context.Context, d config.DockerV2) bool {
    _, err := tmpl.New(ctx).Slice(d.Tags, tmpl.NonEmpty())
    return err == nil
}

Try / catch

if err := pipe.Run(ctx); err != nil {
    if strings.Contains(err.Error(), "invalid tags:") {
        log.Fatalf("fix dockers_v2.tags templates: %v", err)
    }
    return err
}

Prevention

When it happens

Trigger: A `dockers_v2.tags` entry contains invalid template syntax or unknown fields, e.g. `tags: ["{{.Version"], evaluated while makeArgs prepares buildx arguments.

Common situations: Typos like `{{.Ver}}`, using fields that don't exist on the release context, malformed conditionals in tags such as `{{ if .IsNightly }}nightly`, or leftover template remnants after refactoring config.

Related errors


AI-assisted analysis of goreleaser/goreleaser@f5edd73956 (2026-09-05). Data as JSON: /api/errors/5a7b7b4999cf276e. Report an issue: GitHub.