fix(docker): gate resource limit flags on cgroup controller availability (#54516)

On hosts where the cgroup v2 cpu/memory/pids controllers are not delegated
to the docker/podman process (unprivileged Proxmox LXCs, some rootless and
nested setups), --pids-limit/--cpus/--memory cause every container start to
fail with OCI runtime error / exit 126, breaking terminal + execute_code.

- Add _cgroup_limits_available(image): one-shot, host-wide cached probe that
  spawns a throwaway container from the sandbox image itself (sleep 0) with
  all three flags together, mirroring the existing _storage_opt_supported
  probe-and-degrade pattern.
- Remove --pids-limit from static _BASE_SECURITY_ARGS; apply it (default 256
  via _DEFAULT_PIDS_LIMIT) in resource_args gated on the probe.
- Gate --cpus and --memory on the same probe.

Behavior unchanged on cgroup-capable hosts; graceful degradation with a
one-time warning where controllers aren't delegated.

Fixes #6568.

(cherry picked from commit c933880b7e)

Co-authored-by: angelos <angelos@oikos.lan.home.malaiwah.com>
This commit is contained in:
Ben Barclay 2026-06-29 11:01:08 +10:00 committed by GitHub
parent 10043c6d0c
commit 7cfa2fa13f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 169 additions and 5 deletions

View file

@ -11,7 +11,13 @@ def _mock_subprocess_run(monkeypatch):
"""Mock subprocess.run to intercept docker run -d and docker version calls.
Returns a list of captured (cmd, kwargs) tuples for inspection.
Pre-seeds the cgroup-limit probe cache to ``True`` so the throwaway probe
container (a ``docker run ... sleep 0``) does not run and pollute the
captured call list these tests inspect the real sandbox-start ``run``.
Tests that exercise the probe itself live in test_docker_cgroup_limits.py.
"""
docker_env._cgroup_limits_ok = True
calls = []
def _run(cmd, **kwargs):