让我们有一个简单的蛇文件,如

rule targets:
    input:
        "plots/dataset1.pdf",
        "plots/dataset2.pdf"

rule plot:
    input:
        "raw/{dataset}.csv"
    output:
        "plots/{dataset}.pdf"
    shell:
        "somecommand {input} {output}"

我想归纳出绘图规则,以便它可以在docker容器中运行,就像
rule targets:
    input:
        "plots/dataset1.pdf",
        "plots/dataset2.pdf"

rule plot:
    input:
        "raw/{dataset}.csv"
    output:
        "plots/{dataset}.pdf"
    singularity:
        "docker://joseespinosa/docker-r-ggplot2"
    shell:
        "somecommand {input} {output}"

如果我了解得很好,当我运行snakemake --use-singularity时,我会获得somecommand在docker容器中运行,在该容器中,如果不对容器进行一些卷配置,则找不到输入的csv文件。

您能否提供一个小的工作示例,说明如何在Snakefile或其他Snakemake文件中配置卷?

最佳答案

当您运行snakemake并告诉它使用奇点图像时,您可以执行以下操作:
snakemake --use-singularity
您还可以将其他参数传递给奇异性,包括绑定(bind)点,如下所示:
snakemake --use-singularity --singularity-args "-B /path/outside/container/:/path/inside/container/"
现在,如果您的csv文件位于/path/outside/container/中,则可以通过somecommand毫无问题地看到它。

请记住,如果您的内部和外部路径不相同,则需要在snakemake规则的不同部分中同时使用这两个路径。这是我的方法:

rule targets:
    input:
        "plots/dataset1.pdf",
        "plots/dataset2.pdf"

rule plot:
    input:
        "raw/{dataset}.csv"
    output:
        "plots/{dataset}.pdf"
    params:
        i = "inside/container/input/{dataset}.csv",
        o = "inside/container/output/{dataset}.pdf"
    singularity:
        "docker://joseespinosa/docker-r-ggplot2"
    shell:
        "somecommand {params.i} {params.o}"

当您运行该snakefile时,请将raw/绑定(bind)到inside/container/input/,然后将plots/绑定(bind)到inside/container/output/。 Snakemake会在本地计算机上查找输入/输出文件,但会向容器提供命令以使用内部容器路径运行,因此一切都会变得很棒。

TL; DR:输入和输出中的本地路径,params和shell中的容器路径。在命令行调用中绑定(bind)本地和容器路径。

关于docker - Snakemake + docker示例,如何使用卷,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52742698/

10-11 03:56