W dockerze pliki utworzone w kontenerach mają zazwyczaj nieprzewidywalną własność podczas sprawdzania ich z hosta. Właścicielem plików na woluminie jest domyślnie root (identyfikator UID 0), ale gdy tylko konta użytkowników innych niż root są zaangażowane w kontenerze i zapisują w systemie plików, właściciele stają się mniej lub bardziej losowi z punktu widzenia hosta.
Jest to problem, gdy trzeba uzyskać dostęp do danych woluminu z hosta przy użyciu tego samego konta użytkownika, które wywołuje polecenia dockera.
Typowe obejścia to
- wymuszanie identyfikatorów użytkowników podczas ich tworzenia w plikach Dockerfiles (nieprzenośnych)
- przekazanie identyfikatora UID użytkownika hosta do
docker runpolecenia jako zmiennej środowiskowej, a następnie uruchomienie niektórychchownpoleceń na woluminach w skrypcie punktu wejścia.
Oba te rozwiązania mogą zapewnić pewną kontrolę nad rzeczywistymi uprawnieniami poza kontenerem.
Spodziewałem się, że ostatecznym rozwiązaniem tego problemu będą przestrzenie nazw użytkowników. Przeprowadziłem kilka testów z niedawno wydaną wersją 1.10 i opcją --userns-remap ustawioną na moje konto na komputerze. Nie jestem jednak pewien, czy może to ułatwić uporanie się z własnością plików na zamontowanych woluminach, obawiam się, że w rzeczywistości może być odwrotnie.
Załóżmy, że uruchomię ten podstawowy kontener
docker run -ti -v /data debian:jessie /bin/bash
echo 'hello' > /data/test.txt
exit
A następnie sprawdź zawartość od hosta:
ls -lh /var/lib/docker/100000.100000/volumes/<some-id>/_data/
-rw-r--r-- 1 100000 100000 6 Feb 8 19:43 test.txt
Ten numer „100000” jest pod-UID mojego użytkownika hosta, ale ponieważ nie odpowiada on identyfikatorowi mojego użytkownika, nadal nie mogę edytować pliku test.txt bez uprawnień. Ten użytkownik podrzędny nie wydaje się mieć żadnego powiązania z moim rzeczywistym zwykłym użytkownikiem poza platformą docker. Nie jest odwzorowany.
Obejścia wspomniane wcześniej w tym poście, które polegały na wyrównywaniu identyfikatorów UID między hostem a kontenerem, nie działają już z powodu UID->sub-UIDmapowania występującego w przestrzeni nazw.
W takim razie, czy istnieje sposób na uruchomienie dockera z włączoną przestrzenią nazw użytkownika (w celu zwiększenia bezpieczeństwa), jednocześnie umożliwiając użytkownikowi hosta z uruchomionym dockerem posiadanie plików wygenerowanych na woluminach?