Zamontuj katalog hosta z dowiązaniem symbolicznym w kontenerze Dockera

115

Zamontowałem kontener z tym parametrem:

-v / home / test /: / home / test

Wewnątrz / home / test na hoście znajduje się dowiązanie symboliczne wskazujące na folder / mnt /.

Ale ten link, chociaż można zobaczyć, gdzie wskazuje, wydaje się uszkodzony w kontenerze:

root@f93f72b45013:/var/www/html# cd /home/test/ 
root@f93f72b45013:/home/test# ls -lrt 
total 11956 
lrwxrwxrwx. 1 root root 40 Jul 20 15:55 file -> /mnt/mountedfile/
root@f93f72b45013:/home/test# ls -lrt file/*
ls: cannot access file/*: No such file or directory

Czy w ogóle można to zrobić w dockerze? Nie jestem pewien, czy jest na to sposób.

Wiem, że mogę bezpośrednio zamontować tam, gdzie wskazuje dowiązanie symboliczne, ale zastanawiałem się tylko, czy to jest możliwe.

lapinkoira
źródło
Słyszałem o problemach z mapowaniem do /mntpunktu końcowego, który może być specyficzny dla hosta - najbezpieczniej byłoby tego uniknąć, jeśli możesz.
ldg

Odpowiedzi:

156

Linki symboliczne to duże wyzwanie w dockerze. W twoim przypadku możesz zamontować oba katalogi:

-v /home/test/:/home/test -v /mnt/mountedfile:/mnt/mountedfile

Aby dowiązania symboliczne działały zarówno w kontenerze, jak i poza nim, muszą być ścieżkami bezwzględnymi i używać dokładnie tych samych nazw.

Ogólnie rzecz biorąc, łącza symboliczne nie działają w oknie dokowanym. Znalazłem to na własnej skórze.

Kemin Zhou
źródło
Co zrobić, jeśli w oknach mam dowiązanie symboliczne. Ścieżka może mieć format c: \ (z literą dysku, średnikiem i ukośnikiem odwrotnym)?
Eitan
2
@Eitan Opuść okna i korzystaj z systemów linux / unix, gdy chcesz pracować z dockerem
Nam G VU
Tak. Powiedziałem, że Windows działa z CIF, a NFS jest tylko w wersjach Windows Server (dlaczego ten podstawowy jest tylko na serwerach Windows - tylko dlatego, że to kosztuje, a Microsoft chce, żebyś zapłacił).
Eitan
Walczyłem przez cały dzień, próbując uruchomić łącze symboliczne magazynu Laravel. Dla docker-composekonfiguracji byłoby tak. volumes: [./:/var/www, ./public/storage:/var/www/public/storage]. Tutaj public/storagejest link symboliczny do ./storage/app/public. Dziękuję za rozwiązanie!
Jan Iwanow
20

Jednym z rozwiązań jest zainstalowanie oryginalnego pliku przez platformę Docker, ale użycie polecenia, readlink -fktóre drukuje rzeczywistą lokalizację pliku. W ten sposób nadal możesz odwoływać się do lokalizacji dowiązania symbolicznego w poleceniu, np

docker run -it -v $(readlink -f /home/test/):/home/test/ ...

user2640621
źródło
Nie działa - powoduje to te same brakujące
linki
W systemie macOS: perl -MCwd -le 'print Cwd::abs_path(shift)' "$path"(ze stackoverflow.com/questions/7665/… )
akauppi,
8
Nie testowałem tego w Dockerze, ale po zabawie z readlink wydaje się, że będzie to działać z / home / test / jest dowiązaniem symbolicznym, ale nie, jeśli / home / test / zawiera dowiązanie symboliczne.
Justin Donnelly