Смонтировать каталог хоста с символической ссылкой внутри контейнера докеров


105

Я смонтировал контейнер с таким параметром:

-v / дом / тест /: / дом / тест

Внутри / 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. Спасибо за решение!
Jan Iwanow

19

Одно из решений - заставить Docker смонтировать исходный файл, но использовать, readlink -fкоторый печатает фактическое местоположение файла. Таким образом, вы все равно можете ссылаться на расположение символической ссылки в своей команде, например

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


Не работает - это приводит к тому же отсутствующим символическим
ссылкам

На 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.