奇点工作流程设计

singularity workflow design

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

在用户端,他们会运行像这样: 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"

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

谢谢大家!

这取决于你想如何评估参数。如果您可以使用 /bin/sh,您可以直接在 %runscript 中使用它。例如,

%runscript
    if [ $# -ne 3 ]; then
        echo "You must give 3 files"
        exit 1
    fi
    file1=""
    file2=""
    file3=""
    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) 的问题,并且可能仍然是当前版本的问题。