
Ich führe häufig einen VS Code-Entwicklungscontainer aus, um ein Home Assistant-Add-on zu entwickeln. Dieser Entwicklungscontainer führt Docker aus (innerhalb meines Host-Dockers). Nach einigen Arbeitsstunden geht meinem Host-Docker der Speicherplatz aus, was verschiedene Probleme verursacht. Hier wird angezeigt, dass dieser Entwicklungscontainer 52 GB verwendet, was meiner Meinung nach zu viel ist.
% docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 1 1 1.333GB 0B (0%)
Containers 1 1 52.17GB 0B (0%)
Local Volumes 1 1 220.2MB 0B (0%)
Build Cache 0 0 0B 0B
Im Entwicklungscontainer df
ist zu sehen, dass die meiste Nutzung von Docker VFS stammt:
% docker exec 7f666319eddf du -hd 1 /var/lib/docker/
54G /var/lib/docker/vfs
448K /var/lib/docker/containerd
8.0K /var/lib/docker/tmp
20M /var/lib/docker/image
28K /var/lib/docker/volumes
4.0K /var/lib/docker/swarm
3.1M /var/lib/docker/containers
116K /var/lib/docker/buildkit
16K /var/lib/docker/plugins
4.0K /var/lib/docker/runtimes
88K /var/lib/docker/network
54G /var/lib/docker/
Aber innerhalb des Containers denkt Docker, dass seine Container weniger als 1 GB verwenden.
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 21 19 2.829GB 714.7MB (25%)
Containers 100 8 628.7MB 605.8MB (96%)
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B
Und dennoch docker container prune
schrumpfen die 54 GB nach der Ausführung auf 28 GB. Warum erscheint diese Nutzung also nicht in docker system df
?
Ich verwende Docker Desktop 4.28.0 auf macOS Sonoma. Auf Ventura habe ich das gleiche Problem.
Antwort1
Dies geschieht häufig, wenn /var/lib/docker
sich das Objekt im Container und nicht in einem Volume befindet. Das Containerdateisystem ist häufig ein Overlay, und es ist nicht möglich, ein Overlaydateisystem innerhalb eines Overlaydateisystems zu definieren.
Wenn kein Treiber für ein geschichtetes Dateisystem verfügbar ist, kann auf den „nativen“ oder „vfs“-Treiber zurückgegriffen werden, der lediglich eine Kopie des gesamten Dateisystems für jede Schicht ist. Wenn Sie also ein 100 MB großes Image haben und eine einzelne 1 MB große Datei zum Docker-Image hinzufügen, haben Sie jetzt 201 MB Speicherplatz auf dem Laufwerk, 100 MB für die ursprüngliche Schicht und 101 MB für die neue Schicht. Jeder Container muss außerdem eine Lese-/Schreibschicht zum Dateisystem hinzufügen, sodass das gesamte Image für jeden erstellten Container kopiert wird.
Die Lösung besteht darin, ein Volume zu mounten /var/lib/docker
und sicherzustellen, dass die Quelle für diese Mountein unterstütztes zugrunde liegendes Dateisystemdurch einen der geschichteten Dateisystemtreiber.