“Docker原因”;其中一个命令以非零退出代码退出;请注意,snakemake使用bash严格模式&引用;用蛇毒

“Docker原因”;其中一个命令以非零退出代码退出;请注意,snakemake使用bash严格模式&引用;用蛇毒,docker,snakemake,Docker,Snakemake,我在试着用snakemake操作一个docker集装箱。作业运行并产生正确的输出,但当它们完成时,我得到 (one of the commands exited with non-zero exit code; note that snakemake uses bash strict mode!) snakemake试图删除这些文件 我尝试调试的东西: 将| | true、set+u或exit 0添加到规则中的shell命令 运行--printshellcmds中显示的命令(它们运行正常)

我在试着用snakemake操作一个docker集装箱。作业运行并产生正确的输出,但当它们完成时,我得到

(one of the commands exited with non-zero exit code; note that snakemake uses bash strict mode!)
snakemake试图删除这些文件

我尝试调试的东西:

  • | | true
    set+u
    exit 0
    添加到规则中的shell命令

  • 运行
    --printshellcmds
    中显示的命令(它们运行正常)

  • 将docker命令放在bash脚本中的“strict”模式下查看 如果有任何问题(没有)

  • 打印实际出口 规则的
    shell:
    命令中的代码,它将打印0

  • 运行直接在容器中调用的R脚本 从蛇机(它工作良好)

  • --user$(id-u):$(id-g)
    添加到此处建议的docker运行命令:。这 失败,因为容器中的R脚本无处可写 容器中不正确存在作为当前用户的中间文件

以下是蛇形文件规则:

rule run_biospyder:
    input: 
        counts = "{dir}/{name}_counts.csv",
        metadata = "{dir}/{name}_metadata.csv",
    output: directory("{dir}/{name}_output")
    params: 
        dockervol = "/usr/src/data"
    shell:
        """
        docker run \
        -v $PWD:{params.dockervol} biospyderpipeline \
        --config-file {params.dockervol}/config.yml \
        --counts {params.dockervol}/{input.counts} \
        --samples {params.dockervol}/{input.metadata} \
        --output {params.dockervol}/{output} \
        --name {wildcards.name}
        """

映射卷时,此问题是docker权限问题。问题似乎是由于容器内部以root用户身份运行(我正在开发),snakemake试图将
.snakemake\u timestamp
作为我的当前用户写入映射卷(由root用户拥有)的输出目录

我设法用以下方法修复了它:


入口点处的shell脚本创建具有相同id的用户,并运行与该用户相同的任何命令。这意味着映射的卷内容归用户所有,Snakemake可以在运行结束时写入。这也不会修复docker build中的用户id,因此任何人都可以使用它。

映射卷时,该问题是docker权限问题。问题似乎是由于容器内部以root用户身份运行(我正在开发),snakemake试图将
.snakemake\u timestamp
作为我的当前用户写入映射卷(由root用户拥有)的输出目录

我设法用以下方法修复了它:

入口点处的shell脚本创建具有相同id的用户,并运行与该用户相同的任何命令。这意味着映射的卷内容归用户所有,Snakemake可以在运行结束时写入。这也不会修复docker构建中的用户id,因此任何人都可以使用它