首页 > 解决方案 > 在 docker 的共享卷中创建符号并在主机中访问它

问题描述

我正在docker内的主机安装卷中创建符号链接。但我无法在主机上访问它。有没有可能做到。如果是的话,我该怎么做。

我使用以下命令挂载目录

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

然后我使用创建了一个符号链接

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

标签: pythonlinuxdockerunixsymlink

解决方案


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

在您的示例中:

  1. 符号链接指向绝对路径/workspace/log/project_info_hostinfo_timeinfo_exe_param.log
  2. 在容器内部,/workspace目录是挂载的主机目录,所以它可以工作
  3. 容器外,没有/workspace目录,所以不起作用

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

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)

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


推荐阅读