【问题标题】:Mount host directory with a symbolic link inside in docker container在 docker 容器中挂载带有符号链接的主机目录
【发布时间】:2016-11-23 22:43:24
【问题描述】:

我用这个参数挂载了容器:

-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 端点的问题,这可能是特定于主机的——如果可以的话,最安全的做法是避免它。

标签: docker


【解决方案1】:

符号链接是 docker 内部的一大挑战。在您的情况下,您可以挂载两个目录:

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

为了使符号链接在容器内部和外部都有效,它们必须是绝对路径并使用完全相同的名称。

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

【讨论】:

  • 如果我在 Windows 中创建了符号链接,该怎么办。路径可能是 c:\(带有驱动器号、分号和反斜杠)?
  • @Eitan 当你想使用 docker 时,离开 windows 并拥抱 linux/unix 系统
  • 是的。我已经意识到 Windows 可以在 CIF 上运行,而 NFS 仅在 Windows Server 版本上运行(为什么基本只在 Windows 服务器上 - 只是因为它成本高,而且微软希望你付费)。
  • 为了让 Laravel 存储符号链接工作而苦苦挣扎了一整天。对于docker-compose 配置将是这样的。 volumes: [./:/var/www, ./public/storage:/var/www/public/storage]。这里,public/storage 是指向./storage/app/public 的符号链接。感谢您的解决方案!
  • 我可以在 docker 4.2.0 和 windows 10 中使用带有相对路径的符号链接。但是,带有绝对路径的符号链接不起作用
【解决方案2】:

一种解决方案是让 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/…
  • 我没有在 Docker 中测试过它,但是从玩 readlink 来看,这似乎对 /home/test/ is 是一个符号链接有效,但如果不是/home/test/ 包含一个符号链接。
  • 如何将此变量放入docker-compose文件中?
猜你喜欢
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
  • 2022-11-03
  • 2016-11-10
相关资源
最近更新 更多