在Docker容器内部使用符号链接挂载主机目录


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

甚至有可能在docker中完成吗?我不确定是否有办法做到这一点。

我知道我可以直接安装符号链接指向的位置,但是我只是想知道这是否可行。


我听说过映射到/mnt端点的问题,这可能是特定于主机的,最安全的事情是如果可以的话,避免使用它。
ldg '16

Answers:


144

符号链接是Docker内部的一大挑战。您可以挂载两个目录:

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

为了使符号链接在容器内部和外部均能正常工作,它们必须是绝对路径,并使用完全相同的名称。

通常,符号链接在docker内部不起作用。我发现这很困难。


如果我在Windows中建立了符号链接,该怎么办。路径可能是c:\(带有驱动器号,分号和反斜杠)?
Eitan '18

1
@Eitan当您想使用Docker时,离开窗户并拥抱linux / unix系统
Nam G VU

是。我认为Windows可以使用CIF,而NFS仅适用于Windows Server版本(为什么该基本功能仅适用于Windows Server-仅因为它要花钱,而Microsoft要您付费)。
Eitan

为了使Laravel存储符号链接正常工作,这需要花费一整天的时间。对于docker-compose配置将是这样的。volumes: [./:/var/www, ./public/storage:/var/www/public/storage]。这public/storage是的符号链接./storage/app/public。谢谢您的解决方案!
Jan Iwanow

19

一种解决方案是使Docker挂载原始文件,但使用Dockerreadlink -f来打印文件的实际位置。这样,您仍然可以在命令中引用符号链接的位置,例如

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


不起作用-这会导致相同的符号链接丢失
Ami Mahloof

在Mac OS: perl -MCwd -le 'print Cwd::abs_path(shift)' "$path"(从stackoverflow.com/questions/7665/...
akauppi

7
我还没有在Docker中对其进行测试,但是从阅读链接的角度来看,似乎/ home / test /一个符号链接,但如果/ home / test /包含一个符号链接,则不会。
贾斯汀·唐纳利
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.