问题
我正在开发一款人工智能训练应用程序。该应用程序使用 docker,并且一些文件夹是共享的(已安装)。docker 内部和外部的绝对路径不同,我需要创建在两者上都有效的符号链接。
路径
应用程序/opt/shared/app
主持人:/opt/<client>/app/ai/training/<uuid>/models
码头工人/workspace/tlt-experiments/training/<uuid>/models
描述
当我执行一个训练程序(在docker内部)时,它会在目录中生成名为model.epoch0.tlt, model.epoch1.tlt, ... model.epoch<n>.tlt
如果我cd
进入主机目录或docker目录并执行ln -s model.epoch<n>.tlt model.tlt
,我有一个在docker容器内部和主机中有效的链接
但是,如果我从应用程序执行命令来生成链接,我需要使用绝对路由
ln -s /opt/<client>/app/ai/training/<uuid>/models/model.epoch<n>.tlt /opt/<client>/app/ai/training/<uuid>/models/model.tlt
,它对主机有效,但如果我在容器内执行任何操作,它就是一个指向任何内容的无效链接。
是否有一种优雅的方式来创建链接(希望不使用cd-ln-cd
)?
奖金
我目前用来创建链接的命令如下。它帮助我获取最后一个纪元(n)
ls -t <host>/models/ | head -1 | xargs -I @ ln -s <host>/models/@ <host>/models/model.tlt
附加信息
该应用程序的这部分代码是用 c 编写的,但对于链接,我在 system(str) 调用中将 unix 命令作为解析字符串执行。
答案1
如果我
cd
进入主机目录或docker目录并执行ln -s model.epoch<n>.tlt model.tlt
,我有一个在docker容器内部和主机中有效的链接
链接目标与当前目录无关。指定相对路径作为目标将始终存储该路径精确的链接中的路径,无论您cd
是否在某处之后执行此操作。
因此你可以直接使用:
ln -s model.epoch<n>.tlt /opt/<client>/app/ai/training/<uuid>/models/model.tlt
较新的 GNU Coreutils 版本还添加了-r
自动将绝对路径转换为相对路径的选项。