hashicorp/nomad · error

cap_add configured with capabilities not supported by system

Error message

cap_add configured with capabilities not supported by system: %s

What it means

This error is thrown by the Nomad Java driver during task config validation when the cap_add field lists Linux capabilities that the host kernel/system does not support. The driver computes the set of capabilities supported on the system (capabilities.Supported()) and takes its difference with the requested set; any leftover capabilities are reported. This prevents starting tasks that would silently fail or be rejected later by the executor.

Solutions

  1. Remove or correct the unsupported capability names in the task's cap_add field
  2. Check which capabilities the host supports (e.g. 'capsh --print' or compare with capabilities.Supported()) and align the config
  3. If the capability is genuinely needed, move the workload to a host whose kernel supports it
  4. Update Nomad/its capability list if the capability exists but the vendored list is outdated

Example fix

// before
-cap_add = ["CAP_NET_ADMIN", "CAP_SYS_NICE", "CAP_NET_ADMN"]
// after
-cap_add = ["CAP_SYS_NICE"]
Defensive patterns

Strategy: validation

Validate before calling

import "github.com/hashicorp/nomad/client/lib/capabilities"

func checkCapAdd(adds []string) error {
    bad := capabilities.Supported().Difference(capabilities.New(adds))
    if !bad.Empty() {
        return fmt.Errorf("unsupported cap_add: %s", bad)
    }
    return nil
}

Prevention

When it happens

Trigger: A task's drivers.java config (via the TaskConfig's CapAdd field) names a capability not in the system's supported set, e.g. a typo like CAP_NET_ADMN or a capability unavailable on the host kernel, found when taskConfig.validate() runs in StartTask or ValidateTask.

Common situations: Typos in capability names; copying configs between hosts with different kernel versions or seccomp/apparmor restrictions; running Nomad in containers/VMs with a reduced capability set; using newer capabilities (e.g. CAP_CHECKPOINT_RESTORE) on older kernels.

Related errors


AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04). Data as JSON: /api/errors/dd16b05481874af5. Report an issue: GitHub.

Appendix: source

Thrown at drivers/java/driver.go:215

func (tc *TaskConfig) validate() error {
	switch tc.ModePID {
	case "", executor.IsolationModePrivate, executor.IsolationModeHost:
	default:
		return fmt.Errorf("pid_mode must be %q or %q, got %q", executor.IsolationModePrivate, executor.IsolationModeHost, tc.ModePID)

	}

	switch tc.ModeIPC {
	case "", executor.IsolationModePrivate, executor.IsolationModeHost:
	default:
		return fmt.Errorf("ipc_mode must be %q or %q, got %q", executor.IsolationModePrivate, executor.IsolationModeHost, tc.ModeIPC)
	}

	supported := capabilities.Supported()
	badAdds := supported.Difference(capabilities.New(tc.CapAdd))
	if !badAdds.Empty() {
		return fmt.Errorf("cap_add configured with capabilities not supported by system: %s", badAdds)
	}
	badDrops := supported.Difference(capabilities.New(tc.CapDrop))
	if !badDrops.Empty() {
		return fmt.Errorf("cap_drop configured with capabilities not supported by system: %s", badDrops)
	}

	if tc.WorkDir != "" && !filepath.IsAbs(tc.WorkDir) {
		return fmt.Errorf("work_dir must be an absolute path: %s", tc.WorkDir)
	}
	return nil
}

// TaskState is the state which is encoded in the handle returned in
// StartTask. This information is needed to rebuild the taskConfig state and handler
// during recovery.
type TaskState struct {
	ReattachConfig *pstructs.ReattachConfig
	TaskConfig     *drivers.TaskConfig

View on GitHub (pinned to 482b49bf1a)