{# docker/disk.html — what Docker keeps on each host's disk (#5304, #5305):
the hosts side by side with how much each grew, then each host's parts,
its cleanup actions, and its images folded under their repository. #}
{% extends "base.html" %}
{% from "_macros.html" import crumbs, page_header, stat_tile, status_badge %}
{% block title %}Disk — Docker — Steward{% endblock %}
{% block breadcrumb %}{{ crumbs([("Docker", "/plugins/docker/"), ("Disk", "")]) }}{% endblock %}
{% block content %}
{% call page_header("Docker disk", "What Docker keeps on each host's disk, from docker system df, and how it has grown.") %}
{% include "_time_range.html" %}
{% endcall %}
{% if host_groups %}
{% for g in host_groups %}
{% set s = g.summary %}
{{ g.host_name }}
{{ g.total|bytes }}
{% if g.as_of %}as of {{ g.as_of|ago }}{% endif %}
{{ stat_tile("Reclaimable", s.images_reclaimable|bytes, state="warn" if s.images_reclaimable else "ok", hint="held by images no container uses") }}
{{ stat_tile("Images", s.images_size|bytes, hint=s.images_active ~ " of " ~ s.images_total ~ " in use") }}
{{ stat_tile("Container files", s.containers_size|bytes, hint="written by " ~ s.containers_count ~ " containers on top of their images") }}
{{ stat_tile("Volumes", s.volumes_size|bytes, hint=s.volumes_count ~ " volumes; never pruned here") }}
{{ stat_tile("Build cache", s.build_cache_size|bytes, hint="left by docker build; safe to clear") }}
{{ stat_tile("Stopped", g.stopped, state="dim" if not g.stopped else none, hint="containers not running") }}
{# ── Cleanup actions (admin only; audited Ansible prune run) ───────────── #}
{% if session.user_role == 'admin' %}
{% if ansible_available and g.has_target %}
Each runs an audited Ansible playbook on {{ g.host_name }}; reclaimed space shows on the next agent sample.
{% elif not ansible_available %}
Cleanup needs the Ansible runner (currently unavailable).
{% else %}
Link an Ansible target to this host to enable prune actions.
{% endif %}
{% endif %}
{# ── Images by repository, versions folded under it (#5305) ─────────── #}
Images by repository
{% if g.images_capped %}the {{ g.images_listed }} largest of {{ s.images_total }} images{% else %}{{ g.images_listed }} images{% endif %}
{% if g.repos %}
| Repository |
Versions |
Own size |
Used by |
Reclaimable |
{% for r in g.repos %}
{% if r.repo %}{{ r.repo }}{% else %}untagged{% endif %}
| Tag | ID | Size | Shared | Used by |
{% for v in r.versions %}
| {{ v.tag or "—" }} |
{{ (v.image_id or "")|replace("sha256:", "")|truncate(12, true, "") }} |
{{ v.size|bytes }} |
{{ v.shared|bytes }} |
{% if v.containers %}{{ v.containers }} container{{ "s" if v.containers != 1 }}{% else %}nothing{% endif %} |
{% endfor %}
|
{{ r.versions|length }}{% if r.unused %} ({{ r.unused }} unused){% endif %} |
{{ r.own|bytes }} |
{% if r.containers %}{{ r.containers }} container{{ "s" if r.containers != 1 }}{% else %}nothing{% endif %} |
{% if r.reclaimable %}{{ r.reclaimable|bytes }}{% else %}—{% endif %} |
{% endfor %}
{% else %}
No images reported.
{% endif %}
{% endfor %}
{% else %}
No disk usage reported yet. The host agent reports what Docker keeps on disk,
from docker system df, on hosts running Docker.
{% endif %}
{% endblock %}