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
- Fix the template expression in the offending `dockers_v2.tags` entry.
- Use built-in fields like `{{.Version}}`, `{{.Tag}}`, `{{.Major}}.{{.Minor}}` that are known to exist.
- Simplify to literal tags (latest, '{{.Version}}') if conditional templating is not required.
- 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
- Stick to standard tags like '{{.Version}}' and 'latest'
- Run `goreleaser check` to validate template syntax in CI
- Avoid conditional template logic in tags unless tested
- Quote YAML values containing braces
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
- invalid dockerfile: %w
- invalid images: %w
- invalid labels: %w
- invalid annotations: %w
- invalid build args: %w
AI-assisted analysis of goreleaser/goreleaser@f5edd73956 (2026-09-05).
Data as JSON: /api/errors/5a7b7b4999cf276e.
Report an issue: GitHub.