在 docker 的共享卷中创建符号并在主机中访问它

Creating a symbolic in shared volume of docker and accessing it in host machine

我正在 docker 内的主机挂载卷中创建符号 link。但是我无法在主机中访问它。有没有可能做到。如果是,我该怎么做。

我使用了以下命令挂载目录

docker run -it --rm --net host -v $(pwd):/workspace --name myproject my-container:dev

然后我使用

创建了一个符号link
import os
fname = '/workspace/log/project_info_hostinfo_timeinfo_exe_param.log'
symlink_name = '/workspace/log/project_info.log'
os.symlink(fname, symlink_name)

现在,当我尝试查看日志信息时,它看起来像

$ls
lrwxrwxrwx 1 root root   66 Mar  4 14:54 project_info.log -> /workspace/log/project_info_hostinfo_timeinfo_exe_param.log
-rw-r--r-- 1 root root  206 Mar  4 14:54 project_info_hostinfo_timeinfo_exe_param.log

但是当我尝试打开文件时,我收到类似

的消息
$tail -f project_info.log
tail: cannot open 'project_info.log' for reading: No such file or directory
tail: no files remaining

您可以使用您想要的任何路径名创建符号 link。当您访问它时,它在其自己的上下文中用作普通文件系统路径;如果是相对路径,则相对于 link 的位置进行访问。如果您在多个上下文中有相同的文件系统(主机和容器中的绑定挂载 Docker 目录;远程文件系统),则 symlink 可能会在一个上下文中正确解析,但不会正确解析其他.

在你的例子中:

  1. symlink指向绝对路径/workspace/log/project_info_hostinfo_timeinfo_exe_param.log
  2. 容器内部,/workspace目录是挂载的host目录,所以可以
  3. 容器外没有/workspace目录,所以不行

同样在您的示例中,link 及其目标位于同一目录中。这意味着如果 link 目标只是一个文件名,它将在与 link 相同的目录中查找。这样就避免了绝对路径不同的问题。

import os
# If the link target is in the same directory, just use a filename,
# not an absolute path
fname = 'project_info_hostinfo_timeinfo_exe_param.log'
symlink_name = '/workspace/log/project_info.log'
os.symlink(fname, symlink_name)

创建一个 symlink 作为相对路径通常有助于避免重定位目录树的问题; ln -s ../assets/index.html .,例如,即使它在容器上下文中,或者您的同事在他们的工作站上有不同的目录结构,它仍然会指向同一个地方。