Змонтувати хост-каталог із символічним посиланням всередині контейнера докера


104

Я змонтував контейнер з цим параметром:

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

Усередині / home / test у хості є символічне посилання, що вказує на папку / mnt /.

Але це посилання, хоча його можна побачити, куди вказує, здається зламаним всередині контейнера:

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

Чи можливо це взагалі зробити в докері? Я не впевнений, чи є спосіб це зробити.

Я знаю, що можу просто підключити туди, куди вказує символічне посилання, але мені було просто цікаво, чи можливо це.


Я чув про зіставлення проблем до /mntкінцевої точки, яка може бути специфічною для хоста - найбезпечнішим було б уникати цього, якщо зможете.
ldg

Відповіді:


144

Символьні посилання - це великий виклик у docker. У вашому випадку ви можете змонтувати обидва каталоги:

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

Щоб символічні посилання працювали як усередині контейнера, так і за його межами, вони повинні бути абсолютними шляхами та використовувати однакові імена.

Загалом, символьні посилання не працюють всередині докера. Я знайшов це важким шляхом.


Що робити, якщо у мене є символічне посилання у Windows. Шлях може бути c: \ (з буквою диска, крапкою з комою та косою рискою)?
Ейтан

1
@Eitan Залиште вікна та охопіть системи Linux / Unix, коли хочете працювати з докером
Nam G VU

Так. Я зрозумів, що Windows працює з CIF, а NFS є лише у версіях Windows Server (чому це основне лише на серверах Windows - лише тому, що це коштує, і Microsoft хоче, щоб ви заплатили).
Ейтан

Цілий день боровся з цим, намагаючись налагодити роботу символічного посилання для зберігання Laravel. Для docker-composeконфігурації це буде так. volumes: [./:/var/www, ./public/storage:/var/www/public/storage]. Ось public/storageсимволічне посилання на ./storage/app/public. Дякую за рішення!
Ян Іванов

19

Одним із рішень є зробити Docker змонтувати оригінальний файл, але використовувати той, readlink -fякий друкує фактичне місце розташування файлу. Таким чином, ви все ще можете вказати розташування символічного посилання у вашій команді, наприклад

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


Не працює - це призводить до тих самих відсутніх символічних посилань
Ami Mahloof

На MacOS: perl -MCwd -le 'print Cwd::abs_path(shift)' "$path"(від stackoverflow.com/questions/7665 / ... )
akauppi

7
Я не тестував його в Docker, але, погравши з readlink, виявляється, що це буде працювати в / home / test / є символічним посиланням, але не в тому випадку, якщо / home / test / містить символічне посилання.
Джастін Доннеллі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.