Docker WDL Snakemake学习

最近学习了一下DockerWDL以及Snakemake。目前来说,使用Docker将每个流程/软件进行封装应该是生信的主要趋势。现在的想法是将流程都封装到Docker,然后使用WDL或者Snakemake来作为胶水语言串起来。

对于WDL和Snakemake,学习上我个人觉得Snakemake上手更快。WDL目前不太能理解的是为啥需要传入所有的文件(例如使用bwa进行比对需要传入建立的所有索引文件)。WDL将所有需求文件以硬链接/软链接/复制(默认按此顺序进行尝试,可调整)的方式传入,然后再进行运行。而Snakemake对于文件的操作则比较容易理解。再另外,我感觉WDL对于需要设置默认参数的变量的写法有点麻烦,本来以为可以直接在变量后面跟“=”来写,后来发现不行(更新:我悟了,建议使用WDL version 1.0的格式来写,即把需要的输入放进input里,默认的放在input外,另外可选参数需使用?标记),使用womtool来生成的json配置并不能直接使用。

Snakemake里由于是完全按照输入输出去查找运行命令(rule),对于要进行相同操作的文件,需要使用expand,而WDL只需要使用同一个task进行别名即可,这一点我觉得WDL比较好。另外,WDL有Cromwell引擎,现在在各家的云服务器中都直接有现成的部署方式,从这看貌似WDL比较能战未来?

Docker

Docker我主要通过这个教程进行入门。常用命令:

docker build -t <name> .
docker run --rm -u <uid>:<uid> -v <out/>:<in/> <image> <cmd>
docker run -itd -name <name> <image>
docker exec -it <container> <cmd>
docker stop <container>
docker rm <container>
docker pull <image>
docker image list
docker image rm <image>
docker ps -l

测试做了一个基于ubuntu 20.04的image,封装进了bwa、samtools和sambamba,专门用来比对用。

docker pull pzweuj/mapping

Snakemake

Snakemake官方文档。snakemake需要注意的是流程会执行第一条rule,并根据第一条rule的input来找会输出output是这些input的rule,通过这样的关系来运行。常用命令:

snakemake --core 8 --snakefile pipeline.snakefile
snakemake -np <input>
snakemake --dag <input> | dot -Tsvg > dag.svg

WDL

WDL看的是terra上的教程。还有个widdler可以用来操作服务端。常用命令:

java -jar womtools.jar validate pipeline.wdl
java -jar womtools.jar inputs pipeline.wdl -o false > config.json # 不输出可选参数到json
java -jar womtools.jar graph pipeline.wdl | dot -Tsvg > pipeline.svg
java -jar cromwell.jar run pipeline.wdl config.json

# server
java -Dconfig.file=application.conf -jar cromwell.jar server
java -jar cromwell.jar submit -t wdl -i config.json -o option.json -h http://localhost:8000