v0.8.02-beta - doctor ziet koppelingen onder BASE_DIR
Some checks failed
Deploy server-up (dev) / deploy (push) Has been cancelled
Some checks failed
Deploy server-up (dev) / deploy (push) Has been cancelled
De koppeling van BASE_DIR kan intact zijn terwijl de container er toch niets ziet. Docker bindt met propagation rprivate: een koppeling die op de host na het aanmaken van de container ontstaat komt daar niet doorheen, en dan ziet de container de lege map eronder. - --doctor loopt met findmnt alle koppelingen onder BASE_DIR langs en vergelijkt met de mountlijst van de container - ontbreekt er een, dan staat erbij welke en hoe je hem meekoppelt Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
This commit is contained in:
parent
34d0116efd
commit
e0d387c499
4 changed files with 65 additions and 1 deletions
23
CHANGELOG.md
23
CHANGELOG.md
|
|
@ -1,3 +1,26 @@
|
||||||
|
# v0.8.02-beta — Koppelingen ónder BASE_DIR
|
||||||
|
|
||||||
|
`--doctor` zei dat `/opt/serverup` netjes gekoppeld was, en dat klopte ook.
|
||||||
|
Alleen zag Server Up er geen enkele app, terwijl er op de host drie stonden.
|
||||||
|
|
||||||
|
De verklaring zit een niveau dieper. Docker bindt met propagation `rprivate`:
|
||||||
|
een koppeling die op de host **ná** het aanmaken van de container ontstaat, komt
|
||||||
|
daar niet doorheen. Is `stacks` (of `appdata`, of `backups`) een eigen mount —
|
||||||
|
een aparte dataset, een tweede schijf, een netwerkmap — dan ziet de container de
|
||||||
|
lege map eronder. De koppeling van `BASE_DIR` zelf is intact, dus daar valt
|
||||||
|
niets aan op te merken; het scherm blijft alleen leeg.
|
||||||
|
|
||||||
|
`--doctor` loopt nu met `findmnt` alle koppelingen onder `BASE_DIR` langs en
|
||||||
|
vergelijkt ze met wat de container in zijn eigen mountlijst heeft. Ontbreekt er
|
||||||
|
een, dan zegt hij welke, en hoe je hem meekoppelt:
|
||||||
|
|
||||||
|
```
|
||||||
|
✖ /opt/serverup/stacks is op de host een eigen koppeling, maar niet in de container
|
||||||
|
De container ziet daar de lege map eronder. Koppel hem apart mee in
|
||||||
|
docker-compose.yml:
|
||||||
|
- /opt/serverup/stacks:/opt/serverup/stacks
|
||||||
|
```
|
||||||
|
|
||||||
# v0.8.01-beta — "Nog 106 tonen" onder een leeg scherm
|
# v0.8.01-beta — "Nog 106 tonen" onder een leeg scherm
|
||||||
|
|
||||||
De app store toonde geen enkele kaart, met daaronder een knop die beloofde dat
|
De app store toonde geen enkele kaart, met daaronder een knop die beloofde dat
|
||||||
|
|
|
||||||
2
VERSION
2
VERSION
|
|
@ -1 +1 @@
|
||||||
0.8.01-beta
|
0.8.02-beta
|
||||||
|
|
|
||||||
26
install.sh
26
install.sh
|
|
@ -1200,6 +1200,32 @@ PYEOF
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Eigen koppelingen ónder BASE_DIR. Docker bindt met propagation
|
||||||
|
# "rprivate": een koppeling die op de host ná het aanmaken van de
|
||||||
|
# container ontstaat, komt daar niet doorheen. De container ziet dan de
|
||||||
|
# lege map eronder, terwijl op de host alles keurig gevuld is — en de
|
||||||
|
# koppeling van BASE_DIR zelf is intact, dus daar is niets aan te zien.
|
||||||
|
if heeft findmnt; then
|
||||||
|
_diep=0
|
||||||
|
for _mp in $(findmnt -rno TARGET -R "$_basis" 2>/dev/null); do
|
||||||
|
[ "$_mp" = "$_basis" ] && continue
|
||||||
|
_diep=1
|
||||||
|
if $SUDO docker exec server-up sh -c \
|
||||||
|
"grep -q ' $_mp ' /proc/self/mountinfo" 2>/dev/null; then
|
||||||
|
dok_ok "$_mp is een eigen koppeling en komt mee"
|
||||||
|
else
|
||||||
|
dok_fout "$_mp is op de host een eigen koppeling, maar niet in de container"
|
||||||
|
log " De container ziet daar de lege map eronder. Koppel hem"
|
||||||
|
log " apart mee in docker-compose.yml:"
|
||||||
|
log " - $_mp:$_mp"
|
||||||
|
log " of zorg dat de koppeling bestaat vóór de container start."
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
[ "$_diep" -eq 0 ] && log "Geen eigen koppelingen onder $_basis"
|
||||||
|
else
|
||||||
|
dok_waar "findmnt ontbreekt; kon niet nagaan of er koppelingen onder $_basis liggen"
|
||||||
|
fi
|
||||||
# De app store leest uit de git-cache; is die leeg, dan is de lijst leeg.
|
# De app store leest uit de git-cache; is die leeg, dan is de lijst leeg.
|
||||||
_apps="$($SUDO docker exec server-up sh -c \
|
_apps="$($SUDO docker exec server-up sh -c \
|
||||||
'find /data/git -name template.json 2>/dev/null | wc -l' \
|
'find /data/git -name template.json 2>/dev/null | wc -l' \
|
||||||
|
|
|
||||||
|
|
@ -1198,3 +1198,18 @@ def test_doctor_onderscheidt_ontbrekend_van_leeg():
|
||||||
assert "test -d" in blok, "er wordt niet gekeken of de map er is"
|
assert "test -d" in blok, "er wordt niet gekeken of de map er is"
|
||||||
assert "bestaat niet binnen de container" in blok
|
assert "bestaat niet binnen de container" in blok
|
||||||
assert "nog geen enkele app" in blok
|
assert "nog geen enkele app" in blok
|
||||||
|
|
||||||
|
|
||||||
|
def test_doctor_kijkt_naar_koppelingen_onder_base_dir():
|
||||||
|
"""Docker bindt met propagation "rprivate". Een koppeling die op de host ná
|
||||||
|
het aanmaken van de container ontstaat, komt daar niet doorheen: de
|
||||||
|
container ziet de lege map eronder, terwijl de koppeling van BASE_DIR zelf
|
||||||
|
intact is en er dus niets aan te zien is."""
|
||||||
|
tekst = SCRIPT.read_text(encoding="utf-8")
|
||||||
|
blok = tekst[tekst.index("Wat Server Up zelf ziet"):]
|
||||||
|
blok = blok[:blok.index("\n printf ")]
|
||||||
|
assert "findmnt" in blok, "er wordt niet naar koppelingen gekeken"
|
||||||
|
assert "/proc/self/mountinfo" in blok, "de containerkant wordt niet vergeleken"
|
||||||
|
assert "eigen koppeling, maar niet in de container" in blok
|
||||||
|
# De uitweg hoort erbij te staan, anders weet je nog niets.
|
||||||
|
assert "docker-compose.yml" in blok
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue