Environment
Unraid 7.3.2. The relevant code is unchanged on current master (line refs below are master).
Summary
Containers whose template has no Icon get the shared fallback path recorded as their personal icon, and removeContainer() later unlinks that recorded path — deleting question.png from the docroot for the whole system. The file only comes back on reboot (bzroot re-extract).
Chain
include/DockerClient.php:346 — if (empty($tmp['icon'])) $tmp['icon'] = '/plugins/dynamix.docker.manager/images/question.png'; → persisted per-container into the webui-info registry (docker.json).
include/DockerClient.php:894 (removeContainer()) — $iconRAM = $docroot.$info[$name]['icon']; if ($cache>=1 && is_file($iconRAM)) unlink($iconRAM); — for an icon-less container, $info[$name]['icon'] is the shared fallback, so the static file /usr/local/emhttp/plugins/dynamix.docker.manager/images/question.png gets unlinked.
- Anything that removes/recreates such a container with cache flags triggers it. Observed in the wild via CA Docker Auto-Update updating an icon-less container: syslog
Installing Updates ... 22:03:08–22:06:30, images dir mtime 22:06:02, question.png gone.
Impact / aggravator
Once the file is missing, include/DockerContainers.php:99-100 renders icon-less containers with src = question.png and onerror=this.src='(the same path)'. Since the fallback itself now 404s, the unguarded onerror reassigns the same src and the browser re-requests in a tight loop — measured ~737 requests in 5 seconds from a single open Docker page with 15 such <img>s (≈150 req/s against nginx, plus error-log churn on the /var/log tmpfs). Third-party plugins that reuse the same fallback path in their own onerror handlers (e.g. folder-view style plugins) inherit the storm.
Reproduction
- Create a container with no
Icon template value — its docker.json entry records icon: /plugins/dynamix.docker.manager/images/question.png.
- Update or remove it through a path that passes cache flags (CA Docker Auto-Update does).
ls /usr/local/emhttp/plugins/dynamix.docker.manager/images/ → question.png is gone; the Docker page now 404-loops for every icon-less container until the next reboot.
Suggested fix
In removeContainer(), only unlink per-container cached icons (<name>-icon.png under images-ram/images) and never the shared default — e.g. skip the unlink when the recorded icon equals the question.png constant. Independently, guarding the JS fallback in DockerContainers.php (onerror="this.onerror=null;this.src=...") would eliminate the 404-loop failure class entirely.
Environment
Unraid 7.3.2. The relevant code is unchanged on current
master(line refs below are master).Summary
Containers whose template has no
Iconget the shared fallback path recorded as their personal icon, andremoveContainer()later unlinks that recorded path — deletingquestion.pngfrom the docroot for the whole system. The file only comes back on reboot (bzroot re-extract).Chain
include/DockerClient.php:346—if (empty($tmp['icon'])) $tmp['icon'] = '/plugins/dynamix.docker.manager/images/question.png';→ persisted per-container into the webui-info registry (docker.json).include/DockerClient.php:894(removeContainer()) —$iconRAM = $docroot.$info[$name]['icon']; if ($cache>=1 && is_file($iconRAM)) unlink($iconRAM);— for an icon-less container,$info[$name]['icon']is the shared fallback, so the static file/usr/local/emhttp/plugins/dynamix.docker.manager/images/question.pnggets unlinked.Installing Updates ...22:03:08–22:06:30, images dir mtime 22:06:02,question.pnggone.Impact / aggravator
Once the file is missing,
include/DockerContainers.php:99-100renders icon-less containers withsrc= question.png andonerror=this.src='(the same path)'. Since the fallback itself now 404s, the unguardedonerrorreassigns the same src and the browser re-requests in a tight loop — measured ~737 requests in 5 seconds from a single open Docker page with 15 such<img>s (≈150 req/s against nginx, plus error-log churn on the/var/logtmpfs). Third-party plugins that reuse the same fallback path in their ownonerrorhandlers (e.g. folder-view style plugins) inherit the storm.Reproduction
Icontemplate value — its docker.json entry recordsicon: /plugins/dynamix.docker.manager/images/question.png.ls /usr/local/emhttp/plugins/dynamix.docker.manager/images/→question.pngis gone; the Docker page now 404-loops for every icon-less container until the next reboot.Suggested fix
In
removeContainer(), only unlink per-container cached icons (<name>-icon.pngunder images-ram/images) and never the shared default — e.g. skip the unlink when the recorded icon equals the question.png constant. Independently, guarding the JS fallback inDockerContainers.php(onerror="this.onerror=null;this.src=...") would eliminate the 404-loop failure class entirely.