Volumes werden nicht gemountet - häufige Konfigurationsfehler in Compose

Volumes werden nicht gemountet - häufige Konfigurationsfehler in Compose

Volume-Probleme in Compose sind tricky, weil kein Fehler geworfen wird – stattdessen entsteht still ein falsches Volume oder ein leerer Mount.

Fehler 1: Fehlender Top-Level-volumes-Block

Das ist der häufigste Fehler. Ein named Volume muss sowohl im Service als auch im Top-Level-volumes-Block deklariert sein.

# FALSCH – kein Top-Level-Block
services:
  db:
    image: postgres:16
    volumes:
      - pgdata:/var/lib/postgresql/data

# RICHTIG
services:
  db:
    image: postgres:16
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:  # Dieser Block ist zwingend notwendig

Fehlt der Top-Level-Block, erstellt Compose ein anonymes Volume mit einem Hash-Namen wie myapp_pgdata_a3f9b2c1 – aber keines mit dem erwarteten Namen. Die Daten landen an der falschen Stelle.

Fehler 2: Tippfehler im Volume-Namen

services:
  db:
    volumes:
      - pgdat:/var/lib/postgresql/data  # Tippfehler: fehlendes 'a'

volumes:
  pgdata:  # Wird nie verwendet

Compose erstellt dann ein neues Volume myapp_pgdat – kein Fehler, einfach leer und ohne die alten Daten.

Fehler 3: Relative Pfade

Compose löst relative Pfade relativ zum Speicherort der docker-compose.yml auf – nicht relativ zum aktuellen Arbeitsverzeichnis.

# compose.yml liegt in /home/user/myapp/
# Diese Konfiguration:
volumes:
  - ./data:/app/data
# Wird aufgelöst zu: /home/user/myapp/data:/app/data

# Wenn man compose aus /home/user/ aufruft:
docker compose -f myapp/docker-compose.yml up
# Pfad bleibt /home/user/myapp/data – korrekt

Fehler 4: Windows-Pfadformat

Auf Windows müssen Pfade im Compose-Format korrekt angegeben werden:

# FALSCH auf Windows
volumes:
  - C:\Users\user\data:/app/data

# RICHTIG
volumes:
  - C:/Users/user/data:/app/data
  # oder
  - /c/Users/user/data:/app/data

Fehler 5: SELinux-Labels fehlen

Auf SELinux-Systemen (RHEL, Fedora) werden Bind Mounts ohne das richtige Label blockiert:

# FALSCH auf SELinux-Systemen
volumes:
  - ./data:/app/data

# RICHTIG: :z für geteiltes Label, :Z für privates Label
volumes:
  - ./data:/app/data:z

Diagnose: Was wurde wirklich gemountet?

# Mounts eines laufenden Containers inspizieren
docker inspect mycontainer | python3 -m json.tool | grep -A 20 '"Mounts"'

# Oder gezielt
docker inspect mycontainer --format '{{json .Mounts}}' | python3 -m json.tool

Ausgabe zeigt Typ (volume/bind), Source (Pfad auf Host oder Volume-Name) und Destination (Pfad im Container).

Alle Volumes auflisten und Anomalien finden

# Alle Volumes anzeigen – viele Hash-Namen deuten auf anonyme Volumes hin
docker volume ls

# Unbenutzte Volumes anzeigen (potentielle Waisen)
docker volume ls -f dangling=true

Viele Volumes mit langen Hash-Namen bedeuten meist, dass irgendwo der Top-Level-volumes-Block fehlt oder ein Tippfehler vorliegt.