python - 在 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
解决方案
您可以使用所需的任何路径名创建符号链接。当您访问它时,它在自己的上下文中用作普通文件系统路径;如果是相对路径,则相对于链接的位置进行访问。如果您在多个上下文中具有相同的文件系统(主机和容器中的绑定挂载的 Docker 目录;远程文件系统),则符号链接可能会在一个上下文中正确解析,但在另一个上下文中则不能正确解析。
在您的示例中:
- 符号链接指向绝对路径
/workspace/log/project_info_hostinfo_timeinfo_exe_param.log
- 在容器内部,
/workspace
目录是挂载的主机目录,所以它可以工作 - 容器外,没有
/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 .
例如,即使它在容器上下文中,或者您的同事在他们的工作站上具有不同的目录结构,它仍然会指向同一个位置。
推荐阅读
- machine-learning - 如何使随机梯度下降最终不会杀死所有权重
- javascript - JQuery - 在 DOM 中的任何地方首次出现向上移动的类
- vuejs2 - VeeValidate - 如何验证应该使用 http:// 的 URL
- javascript - 谷歌地图:将动画符号添加到带有虚线集的折线
- javascript - 如何在 axios 拦截器中重定向?
- python - python:映射列值的组合以提取列表项
- angularjs - AngularJS:如何让视图的初始化等到我们得到服务的响应?
- java - 无法在java中写入我的属性文件
- go - 使用 Golang 从文本文件末尾读取特定内容的有效方法
- flutter - 在颤动中获取 LayoutBuilder 高度