mirror of
https://github.com/usestrix/strix.git
synced 2026-08-24 20:02:39 +02:00
fix(runtime): cap sandbox container logs to prevent host disk exhaustion (#785)
This commit is contained in:
@@ -42,6 +42,7 @@ from agents.sandbox.session.sandbox_session import SandboxSession
|
|||||||
from agents.sandbox.types import ExposedPortEndpoint
|
from agents.sandbox.types import ExposedPortEndpoint
|
||||||
from docker import errors as docker_errors # type: ignore[import-untyped, unused-ignore]
|
from docker import errors as docker_errors # type: ignore[import-untyped, unused-ignore]
|
||||||
from docker.models.containers import Container # type: ignore[import-untyped, unused-ignore]
|
from docker.models.containers import Container # type: ignore[import-untyped, unused-ignore]
|
||||||
|
from docker.types import LogConfig # type: ignore[import-untyped, unused-ignore]
|
||||||
from docker.types import Mount as DockerSDKMount # type: ignore[import-untyped, unused-ignore]
|
from docker.types import Mount as DockerSDKMount # type: ignore[import-untyped, unused-ignore]
|
||||||
from docker.utils import parse_repository_tag # type: ignore[import-untyped, unused-ignore]
|
from docker.utils import parse_repository_tag # type: ignore[import-untyped, unused-ignore]
|
||||||
from requests.exceptions import RequestException
|
from requests.exceptions import RequestException
|
||||||
@@ -89,6 +90,26 @@ def _apply_resource_limits(create_kwargs: dict[str, Any]) -> None:
|
|||||||
create_kwargs["pids_limit"] = int(pids_limit)
|
create_kwargs["pids_limit"] = int(pids_limit)
|
||||||
|
|
||||||
|
|
||||||
|
def _apply_log_limits(create_kwargs: dict[str, Any]) -> None:
|
||||||
|
"""Bound the container's json-file log so a runaway process in the sandbox
|
||||||
|
(e.g. a tool that busy-loops writing to stdout) cannot fill the host disk
|
||||||
|
and take the Docker daemon down with it.
|
||||||
|
|
||||||
|
Unlike the cgroup caps above, this defaults **on** — docker's own default
|
||||||
|
is an unbounded json-file, which is unsafe for an autonomous agent that
|
||||||
|
executes arbitrary commands. ``max-file`` rotation means the on-disk cap is
|
||||||
|
``max-size * max-file``. Set ``STRIX_SANDBOX_LOG_MAX_SIZE`` to ``0``/``off``
|
||||||
|
to opt back out to docker's default."""
|
||||||
|
max_size = os.environ.get("STRIX_SANDBOX_LOG_MAX_SIZE", "50m").strip()
|
||||||
|
if max_size.lower() in ("0", "off", "none", "unlimited"):
|
||||||
|
return
|
||||||
|
max_file = os.environ.get("STRIX_SANDBOX_LOG_MAX_FILE", "3").strip() or "3"
|
||||||
|
create_kwargs["log_config"] = LogConfig(
|
||||||
|
type=LogConfig.types.JSON,
|
||||||
|
config={"max-size": max_size, "max-file": max_file},
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class StrixDockerSandboxSession(DockerSandboxSession):
|
class StrixDockerSandboxSession(DockerSandboxSession):
|
||||||
sandbox_network: str = ""
|
sandbox_network: str = ""
|
||||||
|
|
||||||
@@ -200,6 +221,7 @@ class StrixDockerSandboxClient(DockerSandboxClient):
|
|||||||
|
|
||||||
_apply_sandbox_network(create_kwargs)
|
_apply_sandbox_network(create_kwargs)
|
||||||
_apply_resource_limits(create_kwargs)
|
_apply_resource_limits(create_kwargs)
|
||||||
|
_apply_log_limits(create_kwargs)
|
||||||
|
|
||||||
# Strix injection: host bind mounts (e.g. large repos passed via --mount)
|
# Strix injection: host bind mounts (e.g. large repos passed via --mount)
|
||||||
# that bypass the SDK's file-by-file LocalDir copy.
|
# that bypass the SDK's file-by-file LocalDir copy.
|
||||||
|
|||||||
Reference in New Issue
Block a user