1

我是奇点的新手,正在设置我的第一个容器。我想将容器设置为仅运行一种类型的分析,其中用户可以提供 3 个参数(即文件名)。我想对提供的 3 个文件应用许多命令。我的问题是如何设置容器,以便默认操作(即 %runscript 或类似操作)以某些参数的形式获取用户输入并执行所需的分析。

在用户端,他们会运行类似: singularity run -B /path/to/files the_container.simg file1 file2 file3 并且可以应用我在容器中拥有的工具套件。我想做的一个玩具例子是这样的:

join file1 file2 | sort | uniq | join file2
wc -l file1
wc -c file2
echo "finished"

推荐的方法是将容器包装在脚本中,以便我要运行的命令只是单独传递给容器吗?理想情况下,我希望用户界面对用户隐藏(或至少不明显),因为想法是使用容器在多个中心创建可重现的结果,我们不希望人们修补参数在容器将提供的每个步骤中。

谢谢大家!

4

1 回答 1

1

这取决于您要如何评估参数。如果你对使用没/bin/sh问题,你可以直接在%runscript. 例如,

%runscript
    if [ $# -ne 3 ]; then
        echo "You must give 3 files"
        exit 1
    fi
    file1="$1"
    file2="$2"
    file3="$3"
    join $file1 $file2 | sort | uniq | join $file2
    wc -l $file1
    wc -c $file2
    echo "finished"

如果您更愿意使用不同的语言,您可以将参数传递%runscript给自定义编写的脚本(bash、python、R、perl 等)。确保将此文件复制到定义文件中,并复制到路径或调用中它与绝对路径。例如,

%files
    my_script.py /opt/bin

%runscript
    exec python /opt/bin/my_script.py $@

在这里使用exec也很重要。用新进程替换当前进程有助于确保奇点在收到中断(ctrl-c、OOM 等)时能够杀死任何子进程。对于旧版本(v2)的奇点来说,这是一个问题,对于当前版本来说可能仍然是这种情况。

于 2019-11-26T08:56:14.730 回答