Platzmangel - Ist das Docker-Image zu groß?

Hallo, ich betreibe ein kleines selbstgehostetes Forum auf einer 25 GB großen Cloud-VM mit Debian 13. Ich habe versucht, auf die Version 2026.6.0-latest mit ./launcher rebuild app zu aktualisieren, aber das Update wurde abgebrochen, weil nicht genügend Festplattenspeicher vorhanden war. Ich habe die Aufforderung befolgt, Docker-Images zu bereinigen, aber das hat nicht geholfen. Es sind noch 3,9 GB übrig. Meine Forum-Uploads belaufen sich auf 138 MB, und ich habe Backups im Umfang von 448 MB. Mein Server ist leer, abgesehen von der Discourse-Installation; ich habe nichts anderes damit gemacht.

Nach eingehender Prüfung mit du habe ich festgestellt, dass /var/lib/containerd 13 GB und /var/docker 5,1 GB belegt. Ist es normal, dass diese Verzeichnisse so viel Speicher verbrauchen? Gibt es etwas, das ich dagegen tun kann?

Wenn das normal ist, werde ich wohl einfach mehr Speicherplatz bezahlen müssen. Ich wollte das nur vor der zusätzlichen Ausgabe bestätigen lassen. Danke!

Hmm… hast du schon ./launcher cleanup versucht?

Es lohnt sich, eine Bereinigung durchzuführen. Bitte poste Details dazu, was passiert ist. Hier ist ein Beispiel, das ich einmal durchgeführt habe:

root@ubuntu-2gb-nbg1-1:/var/discourse# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        19G   12G  6.5G  65% /

root@ubuntu-2gb-nbg1-1:/var/discourse# ./launcher cleanup
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B

WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y

Deleted Images:
deleted: sha256:33ce56b3484175342191a344fe1aa9f330431de7bf6f0f0e14f75c5bd851a5b0
deleted: sha256:5e04a0411f813e8f2c1a50d84a7d7bb1b17a855ce041730cf8e3b2fb90144b19
untagged: discourse/base:2.0.20200512-1735
untagged: discourse/base@sha256:7f6c5be23a8e4237cecafaca9d041de5964f8237345b7b183cebdee1f73ed024
deleted: sha256:991acdba0b1f18141192f8682bc5ec1c3365dff0d4fa1c6504e6ce0e3ae6dd76
deleted: sha256:e1c41c8dbd697ae0a61ca612c61f085f69f5bf74c4269cf5c68b4de0fec723fa
deleted: sha256:c2adabaecedbda0af72b153c6499a0555f3a769d52370469d8f6bd6328af9b13
untagged: discourse/base:2.0.20200724-1815
untagged: discourse/base@sha256:1d5eb2f8eae84203b28d3c643648d0dd7d213c2055865cfa5132e30db9e365d5

Total reclaimed space: 2.591GB

# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        19G  8.7G  9.3G  49% /

Es lohnt sich auch, eine detaillierte Übersicht über die Festplattennutzung zu erstellen und diese hier zu posten! Siehe beispielsweise:

Wenn du Backups auf dem System hast, solltest du sie herunterladen, testen und alle außer dem neuesten löschen. Wenn du unter extremem Druck stehst, lösche auch das neueste Backup. (In meinem Fall stelle ich sicher, dass die heruntergeladene Kopie auch durch mein eigenes persönliches Offsite-Backup abgedeckt ist. Habe immer mindestens zwei Kopien.)

Neben du, das Fragen auf Betriebssystemebene beantwortet, kannst du auch Fragen auf Docker-Ebene stellen. Bitte poste deine detaillierten Ergebnisse!

# docker volume ls -qf dangling=true
# docker images -a

Es ist schwierig, die Festplattennutzung auf einer 25G-Instanz im Griff zu behalten – ich habe dies lange Zeit getan, indem ich Zeit investierte und meine Sysadmin-Erfahrung nutzte. Schließlich bin ich den Anbieter gewechselt, habe weniger bezahlt und 40G erhalten, was viel besser war.

Siehe auch vorher:
Discourse-Upgrade schlägt wegen unzureichendem Festplattenspeicher auf 25G-Droplet fehl

Das ist sehr informativ, danke.

Bevor ich cleanup versuche, bietet Discourse eine Möglichkeit, die Integrität von Backups zu überprüfen, ohne eine Wiederherstellung durchzuführen?

Das Ergebnis von du -hx / | sort -h | tail -49 (ich habe festgestellt, dass -h die Ergebnisse für mich leichter lesbar macht):

833M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/42/fs/var/www/discourse/vendor/bundle/ruby
833M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/42/fs/var/www/discourse/vendor/bundle/ruby/3.4.0
837M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/283/fs/var
837M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/283/fs/var/www
837M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/283/fs/var/www/discourse
837M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/283/fs/var/www/discourse/vendor
837M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/283/fs/var/www/discourse/vendor/bundle
837M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/283/fs/var/www/discourse/vendor/bundle/ruby
837M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/283/fs/var/www/discourse/vendor/bundle/ruby/3.4.0
839M	/var/discourse/shared
839M	/var/discourse/shared/standalone
840M	/var/discourse
863M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/42
863M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/42/fs
868M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/283
868M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/283/fs
874M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/284
874M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/284/fs
874M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/43
874M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/43/fs
908M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/263/fs/usr
925M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/22/fs/usr
944M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/263
944M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/263/fs
961M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/22
961M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/22/fs
1.3G	/usr
1.4G	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/251
1.4G	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/251/fs
1.4G	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/251/fs/var
1.4G	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/251/fs/var/www
1.4G	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/251/fs/var/www/discourse
1.5G	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/227/fs/var
1.5G	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/227/fs/var/www
1.5G	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/227/fs/var/www/discourse
1.6G	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/227
1.6G	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/227/fs
2.5G	/var/log
2.5G	/var/log/journal
2.5G	/var/log/journal/1d9299c9656046d6bd0e18d4a09c183c
2.7G	/var/lib/containerd/io.containerd.content.v1.content
2.7G	/var/lib/containerd/io.containerd.content.v1.content/blobs
2.7G	/var/lib/containerd/io.containerd.content.v1.content/blobs/sha256
9.8G	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs
9.8G	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots
13G	/var/lib
13G	/var/lib/containerd
17G	/var
20G	/

Die Ausgabe von docker volume ls -qf dangling=true war leer. Tatsächlich ist auch docker volume ls leer.

docker images -a:

IMAGE                              ID             DISK USAGE   CONTENT SIZE   EXTRA
discourse/base:2.0.20260209-1300   50d2dae489a9       4.77GB         1.12GB        
discourse/base:2.0.20260521-0047   27373b823bbe       4.89GB         1.17GB        
local_discourse/app:latest         01527763be8d        6.9GB         1.63GB    U   

Ich weiß zu wenig über Docker, um diese Ausgabe zu diagnostizieren, aber /var/log/ scheint etwas groß zu sein, wenn es nur Protokolle enthält, und es ist interessant, 3 Images zu haben, obwohl ich nur 1 Forum laufen habe (vielleicht ist das aber völlig normal).

Ich schätze den Hinweis auf mehr Speicherplatz. Ich werde wahrscheinlich erweitern, aber das ist eine gute Lernerfahrung, bevor ich das tue.

Sie können etwas Speicherplatz sparen, indem Sie das Journaling neu konfigurieren:

Ich habe das Docker-Container-Management nie wirklich verstanden. Manchmal hilft eine Bereinigung. Ich habe gerade diese Befehle ausgeführt:

# cd /var/discourse/
# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        38G   24G   13G  67% /
# docker images -a
                                                                                             i Info →   U  In Use
IMAGE                              ID             DISK USAGE   CONTENT SIZE   EXTRA
discourse/base:2.0.20260209-1300   18ccefc73392        3.1GB             0B        
local_discourse/app:latest         810ac5579584       4.57GB             0B    U   
<untagged>                         d303cfc49c99       4.37GB             0B        
<untagged>                         a9d03385c205       4.34GB             0B        
# ./launcher cleanup
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Deleted Images:
deleted: sha256:d303cfc49c992b7fa0b0da65e38f3de79312c6e42eb99e5fd7b27bf4e237ab1d
deleted: sha256:829057c668fd2bd0f7b863c2589e5c3c27364285b39d6df31d38eb208e6410df
untagged: discourse/base:2.0.20260209-1300
untagged: discourse/base@sha256:50d2dae489a9c9916c3d50d880f7f1282fcbe179339b60a8947ab135c1f1f9bf
deleted: sha256:a9d03385c205f740e5f02db0c665a83688f7194d5386bd2d01772b8b5cd5dc65
deleted: sha256:70ec1b4b6cab7365b5f56b8187ef7631e6906fe13b5d3a2b1e39d3457d14514c

Total reclaimed space: 2.517GB
# docker images -a
                                                                                             i Info →   U  In Use
IMAGE                        ID             DISK USAGE   CONTENT SIZE   EXTRA
local_discourse/app:latest   810ac5579584       4.57GB             0B    U   
<untagged>                   18ccefc73392        3.1GB             0B        
# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        38G   21G   15G  59% /

Die Ausgabe von ./launcher cleanup:

WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Deleted Images:
untagged: discourse/base:2.0.20260209-1300
deleted: sha256:50d2dae489a9c9916c3d50d880f7f1282fcbe179339b60a8947ab135c1f1f9bf
deleted: sha256:1bb6f08ca8363e7e002eaf8bafc76b7742d8baa429f816cde77d3d38d234c98a
deleted: sha256:07596c600885cf3f0647c4b41959c5631328ee37af14913b9f2b1b1771ad4f45
untagged: discourse/base:2.0.20260521-0047
deleted: sha256:27373b823bbeca526dd006cefe1c58e7eeca1e5670ab6e619fcd2138f7d50420
deleted: sha256:ab90467600edc09bae8ac2f43420b7c771f87d357aa15646cd40025ec0774fda
deleted: sha256:053438a5cf1727f724f96a4d7af0b135929f633afd8ee05edcddeaf99232b636

Total reclaimed space: 1.17GB

Das ist jedoch seltsam: Mein Discourse-Forum meldete zuvor noch 3,9 GB freien Speicherplatz, jetzt sind es 8,5 GB. Wenn ich erneut du -hx / | sort -h | tail -49 ausführe, könnt ihr das mit meinen vorherigen Ergebnissen vergleichen. /var/lib ist um 8 GB geschrumpft:

628M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/227/fs/var/www/discourse/vendor/bundle/ruby
628M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/227/fs/var/www/discourse/vendor/bundle/ruby/3.4.0
629M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/227/fs/var/www/discourse/vendor
733M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/42/fs/var/www/discourse/vendor/bundle/ruby/3.4.0/gems
792M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/43/fs/var/www/discourse/node_modules/.pnpm
793M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/43/fs/var/www/discourse/node_modules
794M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/43/fs/var
794M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/43/fs/var/www
794M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/43/fs/var/www/discourse
833M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/42/fs/var
833M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/42/fs/var/www
833M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/42/fs/var/www/discourse
833M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/42/fs/var/www/discourse/vendor
833M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/42/fs/var/www/discourse/vendor/bundle
833M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/42/fs/var/www/discourse/vendor/bundle/ruby
833M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/42/fs/var/www/discourse/vendor/bundle/ruby/3.4.0
839M	/var/discourse/shared
839M	/var/discourse/shared/standalone
841M	/var/discourse
863M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/42
863M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/42/fs
874M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/43
874M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/43/fs
925M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/22/fs/usr
961M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/22
961M	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/22/fs
1.3G	/usr
1.4G	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/251
1.4G	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/251/fs
1.4G	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/251/fs/var
1.4G	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/251/fs/var/www
1.4G	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/251/fs/var/www/discourse
1.5G	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/227/fs/var
1.5G	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/227/fs/var/www
1.5G	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/227/fs/var/www/discourse
1.6G	/var/lib/containerd/io.containerd.content.v1.content
1.6G	/var/lib/containerd/io.containerd.content.v1.content/blobs
1.6G	/var/lib/containerd/io.containerd.content.v1.content/blobs/sha256
1.6G	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/227
1.6G	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/227/fs
2.5G	/var/log
2.5G	/var/log/journal
2.5G	/var/log/journal/1d9299c9656046d6bd0e18d4a09c183c
6.4G	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs
6.4G	/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots
7.9G	/var/lib/containerd
8.0G	/var/lib
12G	/var
15G	/

Und docker images -a sieht deutlich anders aus:

IMAGE                        ID             DISK USAGE   CONTENT SIZE   EXTRA
local_discourse/app:latest   01527763be8d        6.9GB         1.63GB    U   

Es scheint, als würde ./launcher cleanup die zurückgewonnene Speichermenge unterschätzen?

Ich sollte jetzt genug Platz für ein Update haben. Es scheint, als wäre es eine gute Gewohnheit, nach einem Update cleanup auszuführen.

Vielen Dank für die Hilfe!

Sie haben gerade zwei Basis-Images bereinigt und das lokal erstellte Image zurückgelassen.

Sind die Basis-Images nur Überbleibsel des ursprünglichen Installationsprozesses? Oder werden sie auch bei einem rebuild app heruntergeladen?

Ja. Das neueste Image wird heruntergeladen, falls es fehlt, und Sie erstellen Ihr lokales Image darauf aufbauend.

Ich kann mir keinen Grund vorstellen, warum Sie mehr als ein Basis-Image behalten möchten …