Tags: homelab docker ugreen nas troubleshooting
Das Problem
Wenn ein Bind-Mount-Zielordner (z.B. /volume2/appdata/<stack>) noch nicht existiert, wenn docker compose up das erste Mal läuft, legt Docker selbst den Ordner an – und zwar als root:root, unabhängig davon, was PUID/PGID im Compose-File gesetzt ist und unabhängig von den Berechtigungen des übergeordneten Ordners.
Das führt zu Fehlern wie:
Error: EACCES: permission denied, mkdir '/app/data/db'
…obwohl PUID/PGID korrekt gesetzt wurden.
Warum das passiert
PUID/PGIDsteuern nur, mit welcher Identität der Container-Prozess läuft- Sie beeinflussen NICHT, mit welchen Rechten Docker einen fehlenden Bind-Mount-Ordner auf dem Host anlegt
- Docker legt fehlende Bind-Mount-Ziele grundsätzlich als
root:rootan - Der Container-Prozess (läuft z.B. als
dominik/1000) kann dann nicht in denroot-Ordner schreiben →EACCES
Diagnose
ls -la /volume2/appdata/<stack>Verdächtig, wenn der Zielordner root root gehört, obwohl der übergeordnete Ordner korrekt dominik admin zeigt:
drwxr-xr-x 1 root root 0 ... .
drwxrwxrwx+ 1 dominik admin 104 ... ..
Fix (nachträglich)
docker compose down
sudo chown -R 1000:10 /volume2/appdata/<stack>
sudo chmod -R 775 /volume2/appdata/<stack>
docker compose up -dPrävention – aktualisierter Workflow für JEDEN neuen Stack
Immer den appdata-Zielordner manuell anlegen, BEVOR docker compose up das erste Mal läuft:
# 1. Ordner manuell anlegen (bevor Docker es tun kann)
mkdir -p /volume2/appdata/<stack-name>
sudo chown -R 1000:10 /volume2/appdata/<stack-name>
# 2. compose.yml erstellen (PUID=1000, PGID=10)
# 3. Erst DANACH starten
cd /volume2/docker-compose/<kategorie>/<stack-name>
docker compose up -dDiese Reihenfolge stellt sicher, dass Docker den Ordner bereits vorfindet (mit korrekten Rechten) statt ihn selbst als root neu anzulegen.
Verwandte Notizen
- Hauptnotiz: NAS Docker-Setup – dort gilt die Faustregel “selbst angelegte Ordner = automatisch korrekte Rechte” nur, wenn der Ordner vor dem ersten Container-Start existiert
- Quartz-Updates – praktisches Beispiel eines Containers mit Volumes
- Grimmory Docker-Compose – weiteres Beispiel mit Datenbank-Volumes