fix(terminal): bridge docker_extra_args to TERMINAL_DOCKER_EXTRA_ARGS in CLI + gateway (#50631)

terminal.docker_extra_args passes flags verbatim to `docker run` (e.g.
--gpus=all, --shm-size=16g). It was wired into DEFAULT_CONFIG,
TERMINAL_CONFIG_ENV_MAP (so `hermes config set` bridged it),
terminal_tool._get_env_config (reads TERMINAL_DOCKER_EXTRA_ARGS), and
DockerEnvironment (applies extra_args) -- but it was MISSING from cli.py's
env_mappings and gateway/run.py's _terminal_env_map.

Consequence: a user who hand-edits config.yaml (rather than running
`hermes config set`) has docker_extra_args silently dropped on the CLI and
gateway/desktop startup paths, while docker_image / docker_volumes (which
ARE in those maps) bridge correctly -- producing the reported 'Hermes
partially reads the Docker config' symptom where --gpus=all and
--shm-size=16g never reach docker run.

This is the same bridge-coverage bug class that shipped before for
docker_run_as_host_user (cli + gateway) and docker_mount_cwd_to_workspace
(gateway). Fix by adding the key to both maps, plus a dedicated regression
pin in test_terminal_config_env_sync.py mirroring the existing
test_docker_*_is_bridged_everywhere guards.
This commit is contained in:
Ben Barclay 2026-06-22 15:41:23 +10:00 committed by GitHub
parent 6202fdfc35
commit de6b3ae377
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 23 additions and 0 deletions

1
cli.py
View file

@ -621,6 +621,7 @@ def load_cli_config() -> Dict[str, Any]:
"container_persistent": "TERMINAL_CONTAINER_PERSISTENT",
"docker_volumes": "TERMINAL_DOCKER_VOLUMES",
"docker_env": "TERMINAL_DOCKER_ENV",
"docker_extra_args": "TERMINAL_DOCKER_EXTRA_ARGS",
"docker_mount_cwd_to_workspace": "TERMINAL_DOCKER_MOUNT_CWD_TO_WORKSPACE",
"docker_run_as_host_user": "TERMINAL_DOCKER_RUN_AS_HOST_USER",
"docker_persist_across_processes": "TERMINAL_DOCKER_PERSIST_ACROSS_PROCESSES",

View file

@ -1464,6 +1464,7 @@ if _config_path.exists():
"container_persistent": "TERMINAL_CONTAINER_PERSISTENT",
"docker_volumes": "TERMINAL_DOCKER_VOLUMES",
"docker_env": "TERMINAL_DOCKER_ENV",
"docker_extra_args": "TERMINAL_DOCKER_EXTRA_ARGS",
"docker_mount_cwd_to_workspace": "TERMINAL_DOCKER_MOUNT_CWD_TO_WORKSPACE",
"docker_run_as_host_user": "TERMINAL_DOCKER_RUN_AS_HOST_USER",
"docker_persist_across_processes": "TERMINAL_DOCKER_PERSIST_ACROSS_PROCESSES",

View file

@ -233,6 +233,27 @@ def test_docker_env_is_bridged_everywhere():
assert "TERMINAL_DOCKER_ENV" in _terminal_tool_env_var_names()
def test_docker_extra_args_is_bridged_everywhere():
"""Regression pin for docker_extra_args config key being silently ignored.
``terminal.docker_extra_args`` in config.yaml passes extra flags verbatim
to ``docker run`` (e.g. ``--gpus=all``, ``--shm-size=16g``). The key was
present in DEFAULT_CONFIG, TERMINAL_CONFIG_ENV_MAP (so ``hermes config
set`` bridged it), terminal_tool._get_env_config (reads
TERMINAL_DOCKER_EXTRA_ARGS), and DockerEnvironment (applies extra_args) --
but it was MISSING from cli.py's env_mappings and gateway/run.py's
_terminal_env_map. So a user who hand-edited config.yaml had their GPU /
shm-size flags silently dropped on the CLI and gateway/desktop paths,
while ``image``/``volumes`` (which were in those maps) bridged fine --
producing the "Hermes partially reads the Docker config" symptom. Guard
all four bridging points so this cannot regress.
"""
assert "docker_extra_args" in _cli_env_map_keys()
assert "docker_extra_args" in _gateway_env_map_keys()
assert "docker_extra_args" in _save_config_env_sync_keys()
assert "TERMINAL_DOCKER_EXTRA_ARGS" in _terminal_tool_env_var_names()
def test_docker_persist_across_processes_is_bridged_everywhere():
"""Regression pin for the cross-process container reuse toggle.