What Causes a Container to Fill the System Disk When Its Data Is Elsewhere?

Eva Wong is the Technical Writer and resident tinkerer at ZimaSpace. A lifelong geek with a passion for homelabs and open-source software, she specializes in translating complex technical concepts into accessible, hands-on guides. Eva believes that self-hosting should be fun, not intimidating. Through her tutorials, she empowers the community to demystify hardware setups, from building their first NAS to mastering Docker containers.

A container can fill the system disk when logs, caches, temporary files, or accidental writes remain inside Docker’s local storage.

Moving a media library or database volume to another pool does not move the container image, writable layer, JSON log, BuildKit cache, metadata, or any path that was omitted from the mount list. A failed external mount can also leave the expected host directory empty, causing the application to write new data into the system disk without an obvious error.

Measure the Docker Root Before Inspecting Application Data

Check the filesystem containing Docker’s data root and compare host directory sizes with Docker’s image, container, volume, and build-cache accounting. Record usage before deleting anything.

A Cloudron user found /var/lib/docker/overlay2 consuming more space than all visible application data, showing why the Docker storage root must be measured independently from external libraries.

If the system disk is full but the external pool has space, identify whether growth sits under containers, overlay layers, volumes, images, or build cache. Do not run a broad prune until active and recoverable data are classified.

Check for Unbounded Container JSON Logs

Inspect the log driver and the size of each container log file. A service can store its primary data elsewhere while stdout and stderr grow indefinitely under Docker’s local container directory.

Code Maven documents a case where docker system df did not reveal the main issue because the default log file kept growing outside that summary. The hidden consumer was an ever-growing container log.

Find and fix the noisy application error before rotating or truncating logs. Configure bounded log rotation for future containers and verify the new files stop growing at the expected limit.

Find Data Written Into the Container Writable Layer

Compare the intended persistent paths with the application’s real cache, transcode, download, database, thumbnail, backup, and temporary directories. Any unmounted write remains in the container’s writable layer on the system disk.

A Docker forum explanation notes that writes and changed image files are stored in the writable layer, while large unrotated logs live in container metadata. Both can make one container consume nearly all local space despite an external data volume.

Use per-container size reporting and inspect the largest changed paths inside the container. Add explicit bind mounts or named volumes only for data that must persist, then recreate the container to discard obsolete writable-layer content after backing up anything valuable.

Verify the External Mount Was Present When the Container Started

Check that the SSD, NAS share, or storage pool was mounted at the expected host path before Docker launched the container. Compare device identity and mount output with the directory the container sees.

When an external mount is absent, the underlying empty directory on the system filesystem may still exist. The container can write normally into that fallback directory, making the system disk grow while the external pool appears untouched.

Stop the container before remounting storage over populated fallback data. Move or reconcile the hidden files safely, add mount dependencies or startup checks, and refuse application startup when the expected device is missing.

Inspect Image Layers, Build Cache, and Abandoned Objects

Review unused images, stopped containers, anonymous volumes, and BuildKit cache. Frequent updates or local builds can accumulate many layers even when the application’s persistent data is correctly mounted elsewhere.

A Moby-project forum explanation clarifies that overlay mounts can make disk figures confusing and that the underlying filesystem usage must be interpreted carefully. A separate Home Assistant case also showed overlay2 growth from logs and layers over time.

Remove only objects confirmed unused by current Compose projects and backups. Never delete individual overlay2 directories manually, because Docker’s metadata references can become inconsistent.

Validate the Fix With a Growth Baseline

After correcting the responsible path, record Docker-root usage, log sizes, container writable sizes, and external-pool usage at regular intervals through the workload that previously caused growth.

The ZimaSpace workflow for staging a large NAS transfer provides a repeatable load for confirming that data lands on the intended pool.

The issue is fixed only when system-disk growth matches expected image and log behavior, persistent application data grows on the external pool, and a missing external mount causes a safe startup failure instead of silent writes to the root filesystem.

Support & Tips

More to Read

Get More Builds Like This

Stay in the Loop

Get updates from Zima - new products, exclusive deals, and real builds from the community.

Stay in the Loop preferences

We respect your inbox. Unsubscribe anytime.