Snakemake + docker 示例,如何使用卷

Snakemake + docker example, how to use volumes

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

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 我在 docker 容器中获得 somecommand 运行,输入 csv 文件不能发现没有容器的一些卷配置。

能否提供一个小的工作示例来描述如何在 Snakefile 或其他 Snakemake 文件中配置卷?

当您 运行 snakemake 并告诉它使用奇点图像时,您可以这样做:

snakemake --use-singularity

您还可以将其他参数传递给奇点,包括绑定点,如下所示:

snakemake --use-singularity --singularity-args "-B /path/outside/container/:/path/inside/container/"

现在,如果您的 csv 文件在 /path/outside/container/ 中,则可以通过一些命令毫无问题地查看它。

请记住,如果您的内部路径和外部路径不相同,您需要在 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/inside/container/input/,绑定plots/inside/container/output/。 Snakemake 将在您的本地计算机上查找 input/output 文件,但会使用容器内部路径向容器提供 运行 的命令,一切都会很棒。

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