Nella finestra mobile, i file creati all'interno dei contenitori tendono ad avere una proprietà imprevedibile durante l'ispezione dall'host. Il proprietario dei file su un volume è root (uid 0) per impostazione predefinita, ma non appena gli account utente non root sono coinvolti nel contenitore e scrivono nel file system, i proprietari diventano più o meno casuali dal punto di vista dell'host.
È un problema quando è necessario accedere ai dati del volume dall'host utilizzando lo stesso account utente che sta chiamando i comandi docker.
Le soluzioni alternative tipiche sono
- forzare gli utenti UID al momento della creazione in Dockerfiles (non portabile)
- passando l'UID dell'utente host al
docker run
comando come variabile di ambiente e quindi eseguendo alcunichown
comandi sui volumi in uno script entrypoint.
Entrambe queste soluzioni possono fornire un certo controllo sulle autorizzazioni effettive all'esterno del contenitore.
Mi aspettavo che gli spazi dei nomi degli utenti fossero la soluzione finale a questo problema. Ho eseguito alcuni test con la versione 1.10 rilasciata di recente e --userns-remap impostato sul mio account desktop. Tuttavia, non sono sicuro che possa rendere la proprietà dei file sui volumi montati più facile da gestire, temo che possa effettivamente essere l'opposto.
Supponiamo che avvii questo contenitore di base
docker run -ti -v /data debian:jessie /bin/bash
echo 'hello' > /data/test.txt
exit
Quindi ispeziona il contenuto dall'host:
ls -lh /var/lib/docker/100000.100000/volumes/<some-id>/_data/
-rw-r--r-- 1 100000 100000 6 Feb 8 19:43 test.txt
Questo numero "100000" è un sub-UID del mio utente host, ma poiché non corrisponde all'UID del mio utente, non posso ancora modificare test.txt senza privilegi. Questo utente secondario non sembra avere alcuna affinità con il mio utente normale effettivo al di fuori di finestra mobile. Non è mappato indietro.
Le soluzioni alternative menzionate in precedenza in questo post che consistevano nell'allineare gli UID tra l'host e il contenitore non funzionano più a causa della UID->sub-UID
mappatura che si verifica nello spazio dei nomi.
Quindi, esiste un modo per eseguire docker con lo spazio dei nomi utente abilitato (per una maggiore sicurezza), pur consentendo all'utente host che esegue docker di possedere i file generati sui volumi?