Stop long prunes failing with a bare 500 (0.60.1)
CI / check (push) Successful in 13m35s
CI / build-and-push (push) Successful in 2m10s

A prune that deletes a lot of data (image prune -a in particular) easily
runs past docker-py's 60s read timeout. requests' ReadTimeout is not a
DockerException, so it slipped past safe_call and the UI only showed
"Request failed with status code 500".

Prunes now use a client with a 540s timeout (below nginx's 600s
proxy_read_timeout), and safe_call turns transport timeouts and
connection errors into DockerError, so they surface as a 502 with a
message.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
menzeljandClaude Opus 5 committed 2026-09-18 09:39:47 +02:00
1 parent 8edea8f971
commit f766ded528
7 files changed
+120 -11

No files matched your search

+2 -2
View File
@@ -1,7 +1,7 @@
"""Image listing for the images router."""
from __future__ import annotations
from docker_client import DockerError, get_client, safe_call
from docker_client import DockerError, get_client, get_long_client, safe_call
from services import update_service
COMPOSE_PROJECT_LABEL = "com.docker.compose.project"
@@ -51,7 +51,7 @@ def prune_images(all_unused: bool = False) -> dict:
"""Remove unused images. By default only dangling (untagged) images are
removed; ``all_unused=True`` removes every image not referenced by a
container (``docker image prune -a``)."""
client = get_client()
client = get_long_client()
# dangling=false tells the engine to also consider tagged-but-unused images.
filters = {"dangling": False} if all_unused else {"dangling": True}
result = safe_call(client.images.prune, filters=filters)