Krótko mówiąc: próbuję zamontować katalog hosta w Dockerze, ale nie mogę uzyskać do niego dostępu z poziomu kontenera, nawet jeśli uprawnienia dostępu wyglądają dobrze.
Szczegóły:
robię
sudo docker run -i -v /data1/Downloads:/Downloads ubuntu bash
i wtedy
ls -al
To daje mi:
total 8892
drwxr-xr-x. 23 root root 4096 Jun 18 14:34 .
drwxr-xr-x. 23 root root 4096 Jun 18 14:34 ..
-rwxr-xr-x. 1 root root 0 Jun 18 14:34 .dockerenv
-rwx------. 1 root root 9014486 Jun 17 22:09 .dockerinit
drwxrwxr-x. 18 1000 1000 12288 Jun 16 11:40 Downloads
drwxr-xr-x. 2 root root 4096 Jan 29 18:10 bin
drwxr-xr-x. 2 root root 4096 Apr 19 2012 boot
drwxr-xr-x. 4 root root 340 Jun 18 14:34 dev
drwxr-xr-x. 56 root root 4096 Jun 18 14:34 etc
drwxr-xr-x. 2 root root 4096 Apr 19 2012 home
i wiele innych takich linii (myślę, że to odpowiednia część).
Jeśli zrobię
cd /Downloads
ls
wynik to
ls: cannot open directory .: Permission denied
Hostem jest Fedora 20, z Docker 1.0.0 i go1.2.2.
Co idzie nie tak?
źródło
-v $(pwd):/app:ro,Z
. To powinno być oznaczone jako poprawna odpowiedź.Jest to problem z SELinux .
Możesz tymczasowo wydać
na hoście, aby uzyskać dostęp lub dodać regułę SELinux, uruchamiając
źródło
OSTRZEŻENIE: To rozwiązanie wiąże się z zagrożeniami bezpieczeństwa.
Spróbuj uruchomić kontener jako uprzywilejowany:
Inną opcją (której nie próbowałem) byłoby utworzenie uprzywilejowanego kontenera, a następnie utworzenie w nim kontenerów nieuprzywilejowanych.
źródło
--privileged=true
--privileged
stanowi zagrożenie bezpieczeństwaZazwyczaj problemy z uprawnieniami do montowania woluminu hosta są spowodowane tym, że identyfikator UID / GID w kontenerze nie ma dostępu do pliku zgodnie z uprawnieniami UID / GID pliku na hoście. Jednak ten konkretny przypadek jest inny.
Kropka na końcu ciągu uprawnień
drwxr-xr-x.
wskazuje, że SELinux jest skonfigurowany. Gdy używasz montowania hosta w SELinux, musisz przekazać dodatkową opcję na końcu definicji woluminu:Polecenie podłączenia woluminu wyglądałoby wtedy następująco:
Więcej informacji o podłączeniach hosta za pomocą SELinuksa można znaleźć na stronie : https://docs.docker.com/storage/#configure-the-selinux-label
W przypadku innych, którzy widzą ten problem z kontenerami działającymi jako inny użytkownik, musisz upewnić się, że identyfikator użytkownika / identyfikator użytkownika w kontenerze ma uprawnienia do pliku na hoście. Na serwerach produkcyjnych jest to często wykonywane przez kontrolowanie identyfikatora UID / GID w procesie kompilacji obrazu, aby dopasować identyfikator UID / GID na hoście, który ma dostęp do plików (lub jeszcze lepiej, nie używaj montowań hosta w produkcji).
Nazwany wolumin jest często preferowany zamiast montowania hosta, ponieważ zainicjuje on katalog woluminów z katalogu obrazów, w tym wszelkie prawa własności i uprawnienia do plików. Dzieje się tak, gdy wolumin jest pusty i kontener jest tworzony z nazwanym woluminem.
Użytkownicy systemu MacOS mają teraz system OSXFS, który automatycznie obsługuje identyfikatory uid / gid między hostem Mac a kontenerami. Jednym z miejsc, w którym nie pomaga, są pliki z wbudowanej maszyny wirtualnej, które są montowane w kontenerze, takie jak /var/lib/docker.sock.
W środowiskach programistycznych, w których identyfikator uid / gid hosta może się zmieniać w zależności od programisty, moim preferowanym rozwiązaniem jest uruchomienie kontenera z punktem wejścia działającym jako root, poprawienie identyfikatora uid / gid użytkownika w kontenerze, aby pasowało do identyfikatora uid / gid woluminu hosta, i następnie użyj,
gosu
aby upuścić z katalogu głównego do użytkownika kontenera, aby uruchomić aplikację w kontenerze. Ważny skrypt do tego znajduje sięfix-perms
w moich podstawowych skryptach graficznych, które można znaleźć na stronie : https://github.com/sudo-bmitch/docker-baseWażnym fragmentem
fix-perms
skryptu jest:To dostaje identyfikator użytkownika w kontenerze i identyfikator pliku, a jeśli się nie zgadzają, wzywa
usermod
do dostosowania identyfikatora użytkownika. Na koniec wyszukuje rekursywnie, aby naprawić pliki, które nie zmieniły identyfikatora użytkownika. Podoba mi się to bardziej niż uruchamianie kontenera z-u $(id -u):$(id -g)
flagą, ponieważ powyższy kod punktu wejścia nie wymaga od każdego programisty uruchomienia skryptu w celu uruchomienia kontenera, a wszelkie pliki poza woluminem, które są własnością użytkownika, zostaną poprawione.Można również zlecić dokerowi zainicjowanie katalogu hosta z obrazu przy użyciu nazwanego woluminu, który wykonuje podłączenie wiązania. Ten katalog musi istnieć wcześniej i należy podać bezwzględną ścieżkę do katalogu hosta, w przeciwieństwie do woluminów hosta w pliku tworzenia, które mogą być ścieżkami względnymi. Katalog musi być również pusty, aby doker mógł go zainicjować. Wyglądają trzy różne opcje definiowania nazwanego woluminu dla montowania wiązania:
Na koniec, jeśli spróbujesz użyć przestrzeni nazw użytkownika, okaże się, że woluminy hosta mają problemy z uprawnieniami, ponieważ uid / gid kontenerów są przesunięte. W tym scenariuszu prawdopodobnie najłatwiej jest uniknąć woluminów hosta i używać tylko woluminów nazwanych.
źródło
Od access.redhat.com:Sharing_Data_Across_Containers :
Wydaje się, że to tylko obejście, ale próbowałem i działa.
źródło
Sprawdziłem, że
chcon -Rt svirt_sandbox_file_t /path/to/volume
to działa i nie musisz działać jako uprzywilejowany kontener.To jest na:
źródło
Spróbować
docker volume create
.Spójrz na dokument https://docs.docker.com/engine/reference/commandline/volume_create/
źródło
Miałem podobny problem, mój był spowodowany niedopasowaniem między UID hosta a UID użytkownika kontenera. Rozwiązaniem było przekazanie UID użytkownika jako argumentu do kompilacji dokera i utworzenie użytkownika kontenera z tym samym UID.
W DockerFile:
W kroku kompilacji:
Następnie uruchomienie kontenera i poleceń zgodnie z OP dało mi oczekiwany wynik.
źródło
Rozwiązałem ten problem, używając kontenera danych, ma to również tę zaletę, że izoluję dane od warstwy aplikacji. Możesz uruchomić go w następujący sposób:
To samouczek zawiera dobre objaśnienie korzystania z kontenerów danych.
źródło
W mojej sytuacji problem był inny. Nie wiem dlaczego, ale nawet jeśli katalog na hoście
chmod 777
działał na nim, wewnątrz dokera było to widoczne jako755
.sudo chmod 777 my_volume_dir
Naprawiono je w kontenerze .źródło
chmod 777
prawie nigdy niczego nie naprawia.sudo -s
zrobił mi lewę na MACźródło