我正在尝试从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脚本中,以查看是否存在任何问题(没有)
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}
"""
问题是映射卷时的docker权限问题。问题似乎是由于内部容器以root身份运行(我正在开发),snakemake尝试以.snakemake_timestamp
当前用户身份写出映射卷(由root拥有)的输出目录。
我设法用以下方法修复它:https : //denibertovic.com/posts/handling-permissions-with-docker-volumes/
入口点的shell脚本创建一个具有相同ID的用户,并以该用户身份运行任何命令。这意味着映射的卷内容归用户所有,Snakemake可以在运行结束时对其进行写入。这也不会在docker build上固定用户ID,因此任何人都可以使用它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句