Docker导致“以非零退出代码退出的命令之一;请注意,snakemake使用bash严格模式!” 与Snakemake

mark_l

我正在尝试从snakemake运行一个Docker容器。作业运行并产生正确的输出,但是当它们完成时,我得到了

(one of the commands exited with non-zero exit code; note that snakemake uses bash strict mode!)

snakemake尝试删除文件。

我尝试调试的事情:

  • 添加|| trueset +uexit 0在shell命令在规则

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

  • 将docker命令以“严格”模式放在bash脚本中,以查看是否存在任何问题(没有)

  • shell:在规则命令中打印实际的退出代码,并打印0

  • 直接从snakemake运行在容器中被调用的R脚本(工作正常)

  • --user $(id -u):$(id -g)建议在此处添加docker run命令中:Snakemake要求使用非零退出代码(即使使用“ || true”)退出规则?这失败了,因为容器中的R脚本无处可写中间文件,因为容器中我的当前用户不正确

这是snakefile规则:

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}
        """
mark_l

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

我设法用以下方法修复它:https : //denibertovic.com/posts/handling-permissions-with-docker-volumes/

入口点的shell脚本创建一个具有相同ID的用户,并以该用户身份运行任何命令。这意味着映射的卷内容归用户所有,Snakemake可以在运行结束时对其进行写入。这也不会在docker build上固定用户ID,因此任何人都可以使用它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章