Singularity复刻Docker ENTRYPOINT/CMD功能遇脚本找不到问题求助
实现Singularity等效Docker ENTRYPOINT+CMD的灵活脚本指定方案
问题背景
原有Dockerfile通过以下配置实现默认启动runscript.sh,同时允许传递参数覆盖为其他挂载脚本:
ENTRYPOINT ["sh"] CMD ["runscript.sh"]
转写为Singularity recipe时,使用%startscript尝试实现等效逻辑:
%startscript exec "$@"
但执行启动命令时报错脚本找不到:
singularity instance start --bind /hostpath:/containerpath model.sif instancename script.sh
错误信息:
/.singularity.d/startscript: 4: exec: script.sh: not found
硬编码路径虽能运行,但缺乏灵活性,需要支持任意指定挂载脚本的方法。
解决方案
1. 直接使用容器内绝对路径指定脚本
Singularity实例启动时默认工作目录是容器根目录/,挂载的脚本位于/containerpath下,因此直接传递容器内的绝对路径即可:
singularity instance start --bind /hostpath:/containerpath model.sif instancename /containerpath/script.sh
2. 通过--pwd参数切换工作目录
启动时指定容器内的工作目录为挂载路径,之后直接传递脚本相对路径:
singularity instance start --bind /hostpath:/containerpath --pwd /containerpath model.sif instancename script.sh
3. 修改Singularity Recipe的%startscript(适用于固定挂载路径场景)
如果挂载路径固定不变,可以在%startscript中先切换到挂载目录,再执行传入的脚本:
%startscript cd /containerpath exec "$@"
之后启动命令只需传递脚本名即可:
singularity instance start --bind /hostpath:/containerpath model.sif instancename script.sh
总结
最通用的方案是使用容器内绝对路径指定脚本,或者配合--pwd参数切换工作目录后使用相对路径,既保留灵活性又避免硬编码问题。
内容的提问来源于stack exchange,提问作者andy
相关产品推荐
相关产品推荐

