docker/cli · error

invalid generic-resource request

Error message

invalid generic-resource request `%s=%s`, Named Generic Resources is not supported for service create or update

What it means

Returned by ParseGenericResources (generic_resource_opts.go:42) when a parsed resource carries a NamedResourceSpec. Services can only request discrete (counted) generic resources, not named/discrete-by-identity resources; the loop at generic_resource_opts.go:40-46 explicitly rejects any entry whose NamedResourceSpec is non-nil.

Solutions

  1. Request a count instead: `--generic-resource "GPU=1"`.
  2. Leave named/identity resources to node labels and node advertisement (`docker node update --label-add`).
  3. Review the generic resources design doc referenced in the source for the named-vs-discrete distinction.

Example fix

// before
docker service create --generic-resource "GPU=device-7" --name svc img
// after
docker service create --generic-resource "GPU=1" --name svc img
Defensive patterns

Strategy: validation

Validate before calling

// Reject named-resource requests for services up front.
func rejectNamedResources(entries []string) error {
    res, err := genericresource.Parse(entries)
    if err != nil { return err }
    for _, r := range res {
        if r.NamedResourceSpec != nil {
            return fmt.Errorf("named generic resources not supported for services: %s=%s",
                r.NamedResourceSpec.Kind, r.NamedResourceSpec.Value)
        }
    }
    return nil
}

Type guard

// isDiscreteOnly reports whether all entries request counted (discrete) resources.
func isDiscreteOnly(entries []string) bool {
    res, err := genericresource.Parse(entries)
    if err != nil { return false }
    for _, r := range res {
        if r.NamedResourceSpec != nil { return false }
    }
    return true
}

Prevention

When it happens

Trigger: Requesting a named generic resource for a service, e.g. `--generic-resource "GPU=device-uuid"` where the value names a specific device rather than a count. Named resources are reserved for node advertisement, not service requests.

Common situations: Copying a node-advertisement format (`GPU=device1`) into a service create/update, or misunderstanding that services consume counts while nodes advertise identities.

Related errors


AI-assisted analysis of docker/cli@4f84911bfe (2026-08-07). Data as JSON: /api/errors/6f1eb6fde0e39237. Report an issue: GitHub.

Appendix: source

Thrown at cli/command/service/generic_resource_opts.go:42

	return val, nil
}

// ParseGenericResources parses an array of Generic resourceResources
// Requesting Named Generic Resources for a service is not supported this
// is filtered here.
func ParseGenericResources(value []string) ([]swarm.GenericResource, error) {
	if len(value) == 0 {
		return nil, nil
	}

	swarmResources, err := genericresource.Parse(value)
	if err != nil {
		return nil, fmt.Errorf("invalid generic resource specification: %w", err)
	}

	for _, res := range swarmResources {
		if res.NamedResourceSpec != nil {
			return nil, fmt.Errorf("invalid generic-resource request `%s=%s`, Named Generic Resources is not supported for service create or update",
				res.NamedResourceSpec.Kind, res.NamedResourceSpec.Value,
			)
		}
	}

	return swarmResources, nil
}

func buildGenericResourceMap(genericRes []swarm.GenericResource) (map[string]swarm.GenericResource, error) {
	m := make(map[string]swarm.GenericResource)

	for _, res := range genericRes {
		if res.DiscreteResourceSpec == nil {
			return nil, fmt.Errorf("invalid generic-resource `%+v` for service task", res)
		}

		_, ok := m[res.DiscreteResourceSpec.Kind]
		if ok {

View on GitHub (pinned to 4f84911bfe)