Use docker in nextflow pipelines

Nextflow可以很方便地搭建数据分析流程,而且对docker,云和集群计算环境也有很好的兼容。这里仅记载我使用nextflow搭建整合了docker功能的分析流程中,常用的命令。

docker相关常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
## build image
docker build -f ./Dockerfile .
## add a tag
docker build -t user/repo:tag .
## push local docker image to the remote repo
docker tag <md5_of_docker_image> user/repo:tag
docker push user/repo:tag
## one line to build an image with predefined name
docker build -t user/repo:tag -f Dockerfile .

## run the docker
docker run -i -t user/repo:tag

## manage the images
### list all the images
docker images
### remove a specific image, might need to add -f to force the operation
docker image rm <md5_of_image>

## export
docker save hifibio/pipeline:scRNAseq_nf_v1.06 | gzip -c > scRNAseq_nf_v1.06.tar.gz

## import
gunzip -c scRNAseq_nf_v1.06.tar.gz | docker import
## or import after gunzip
docker import scRNAseq_nf_v1.06.tar

对于docker镜像导入和导出,可参考这里save and export docker image

nextflow流程启动

1
2
3
##这里默认 nextflow.nf 在当前目录,如果不在,需通过 -c/-C 指定配置文件(-C为覆盖默认参数)
## -with-tower 为使用tower的后台监控功能,开启此功能需在 https://tower.nf/ 注册账号,并将自己的token写到配置文件的 tower section
nextflow run main.nf -with-docker -N user@example.com -with-tower -name name_of_this_run

email通知

如果使用-with-tower可直接打开tower内置的邮件通知,这样流程全部任务结束后,会收到邮件通知。如果需要在不用tower的情况下收到流程运行相关的通知,可以使用如下配置:

1
2
3
4
5
6
7
8
9
10
mail {
from = 'user@163.com'
smtp.host = 'smtp.163.com'
smtp.ssl.enable = true
smtp.port = 465
smtp.user = 'user'
smtp.password = 'passw0rd'
smtp.auth = true
debug = true
}

docker file permission

由于docker流程是以root身份运行,输出文件所有者是root,这样可能会给后续文件修改和清理带来麻烦,要避免此类问题,可在配置中指定docker.fixOwnershiptrue
注意对process的参数修饰,支持通过process名或通配符的方式,这体现了nextflow的灵活性,这里也支持通过指定label的方式完成,具体可参见官方文档

1
2
3
4
5
6
7
8
9
10
11
process {
container = 'aafe3c024859'
docker.enabled = true
docker.fixOwnership = true

withName: 'runFastQC.*' { cpus = 6 }
withName: 'clusterBarcodes.*' { cpus = 62 }
withName: mapTranscripts { cpus = 62 }
withName: createMatrix { cpus = 4 }
withName: createConsensus { cpus = 62 }
}