Forum Discussion
Docker Engine v29 on Linux: Why data-root No Longer Prevents OS Disk Growth (and How to Fix It)
Scope
Applies to Linux hosts only
Does not apply to Windows or Docker Desktop
Problem Summary
After upgrading to Docker Engine v29 or reimaging Linux nodes with this version, you may observe unexpected growth on the OS disk, even when Docker is configured with a custom data-root pointing to a mounted data disk.
This commonly affects cloud environments (VMSS, Azure Batch, self‑managed Linux VMs) where the OS disk is intentionally kept small and container data is expected to reside on a separate data disk.
What Changed in Docker Engine v29 (Linux)
Starting with Docker Engine 29.0, containerd’s image store becomes the default storage backend on fresh installations.
Docker explicitly documents this behavior:
“The containerd image store is the default storage backend for Docker Engine 29.0 and later on fresh installations.”
Docker containerd image store documentation
Key points on Linux:
- Docker now delegates image and snapshot storage to containerd
- containerd uses its own content store and snapshotters
- Docker’s traditional data-root setting no longer controls all container storage
Docker Engine v29 was released on 11 November 2025, and this behavior is by design, not a regression.
Where Disk Usage Goes on Linux
Docker’s daemon documentation clarifies the split:
- Legacy storage (pre‑v29 or upgraded installs):
- All data under /var/lib/docker
- Docker Engine v29 (containerd image store enabled):
- Images & snapshots → /var/lib/containerd
- Other Docker data (volumes, configs, metadata) → /var/lib/docker
Crucially:
“The data-root option does not affect image and container data stored in /var/lib/containerd when using the containerd image store.”
Docker daemon data directory documentation
This explains why OS disk usage continues to grow even when data-root is set to a data disk.
Why the Old Configuration Worked Before
On earlier Docker versions, Docker fully managed image and snapshot storage. Configuring:
{
"data-root": "/mnt/docker-data"
}
Was sufficient to redirect all container storage off the OS disk.
With Docker Engine v29:
- containerd owns image and snapshot storage
- data-root only affects Docker‑managed data
- OS disk growth after upgrades or reimages is expected behavior
This aligns fully with Docker’s documented design changes.
Linux Workaround: Redirect containerd Storage
To restore the intended behavior on Linux, keeping both Docker and containerd storage on the mounted data disk, containerd’s storage path must also be redirected.
A practical workaround is to relocate /var/lib/containerd using a symbolic link.
Example (Linux)
sudo systemctl stop docker.socket docker containerd || true;
sudo mkdir -p /mnt/docker-data /mnt/containerd;
sudo rm -rf /var/lib/containerd;
sudo ln -s /mnt/containerd /var/lib/containerd;
echo "{\"data-root\": \"/mnt/docker-data\"}" | sudo tee /etc/docker/daemon.json;
sudo systemctl daemon-reload;
sudo systemctl start containerd docker'
What This Does
- Stops Docker and containerd
- Creates container storage directories on the mounted data disk
- Redirects /var/lib/containerd → /mnt/containerd
- Keeps Docker’s data-root at /mnt/docker-data
- Restarts services with a unified storage layout
This workaround is effective because it explicitly accounts for containerd‑managed paths introduced in Docker Engine v29, restoring the behavior that existed prior to the change.
Key Takeaways
- Docker Engine v29 introduces a fundamental storage architecture change on Linux
- data-root alone is no longer sufficient
- OS disk growth after upgrades or reimages is expected
- containerd storage must also be redirected
- The workaround aligns with Docker’s official documentation and design
References
- Docker daemon data directory
https://docs.docker.com/engine/daemon/ - containerd image store (Docker Engine v29)
https://docs.docker.com/engine/storage/containerd/ - Docker Engine v29 release notes
https://docs.docker.com/engine/release-notes/29/