2. 环境搭建
好,开始动手了。这一章咱们把武器装上——Nextflow 加上容器引擎。我自己的习惯是先装 Docker 再装 Nextflow,不过顺序无所谓,只要最后能跑通就行。你想想看,没有容器环境,Nextflow 的跨平台可重复性就大打折扣。所以这一步别跳,咱们一步一步来。
2.1 安装 Nextflow
Nextflow 其实就一个 Java 程序,装起来很简单。我个人喜欢用 curl 直接下载,干净利落:
curl -s https://get.nextflow.io | bash
# 或者用 wget
wget -qO- https://get.nextflow.io | bash
# 然后移动到 PATH 里
chmod +x nextflow
sudo mv nextflow /usr/local/bin/
搞定之后验证一下版本:
nextflow -version
# 应该能看到类似输出:
# N E X T F L O W
# version 24.04.2 build 5903
# created 22-08-2024 14:35 UTC
如果你用 Conda 环境,也可以一行搞定:
conda install -c bioconda nextflow
不过 Conda 版本可能稍旧。我自己偏向用官方安装脚本,能第一时间用上新特性。
2.2 安装 Docker
Docker 是容器界的标配。咱们做 RNA-seq 定量,用 Docker 把工具链打包,省去依赖冲突的烦恼。Ubuntu 下的安装命令我贴一下:
# 更新包索引
sudo apt update
# 安装依赖
sudo apt install apt-transport-https ca-certificates curl software-properties-common
# 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 添加仓库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 安装 Docker CE
sudo apt install docker-ce
# 启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
装完后,记得把当前用户加到 docker 组,否则每次都要 sudo:
sudo usermod -aG docker $USER
# 然后注销重新登录,或者执行 newgrp docker
验证一下:
docker run hello-world
# 看到 "Hello from Docker!" 就对了
2.3 安装 Singularity(可选但推荐)
Singularity 是 HPC 集群的宠儿。很多超算中心不允许 Docker(因为权限问题),但 Singularity 可以以普通用户身份运行容器。如果你在集群上跑 RNA-seq,Singularity 几乎是必须的。安装也不复杂:
# 以 Ubuntu 为例
sudo apt install singularity-container
# 或者从源码安装(版本更新)
export VERSION=4.1.0
wget https://github.com/sylabs/singularity/releases/download/v${VERSION}/singularity-ce_${VERSION}-$(lsb_release -cs)_amd64.deb
sudo dpkg -i singularity-ce_${VERSION}-$(lsb_release -cs)_amd64.deb
验证同样简单:
singularity --version
# 或者拉一个测试镜像
singularity pull docker://alpine
singularity exec alpine_latest.sif cat /etc/os-release
注意:Singularity 可以直接从 Docker 镜像构建,所以很多 Docker Hub 上的生物信息学镜像都能直接用。我个人觉得,如果本地开发用 Docker,集群部署转 Singularity,几乎零成本切换。
2.4 配置 Nextflow 使用容器
Nextflow 默认不会自动用容器,你需要在配置文件里告诉它。在项目根目录下创建 nextflow.config,内容如下:
// 启用 Docker
docker.enabled = true
// 或启用 Singularity
// singularity.enabled = true
// 可以指定默认镜像仓库
process.container = 'quay.io/biocontainers/salmon:1.10.1--h7e5ed60_0'
// 本地执行器配置
executor {
name = 'local'
cpus = 4
memory = '8 GB'
}
更灵活的写法是根据配置文件自动选择容器引擎:
// 优先 Docker,如果不可用则用 Singularity
if (System.getenv('DOCKER_AVAILABLE') == 'true') {
docker.enabled = true
} else {
singularity.enabled = true
}
nextflow.config 里用 params 定义容器镜像版本,便于统一管理。比如 params.salmon_image = 'quay.io/biocontainers/salmon:1.10.1--h7e5ed60_0',然后在进程里直接引用。这样改镜像版本只需改一处。
2.5 验证环境是否就绪
空谈无用,跑个最小范例看看。创建一个 hello.nf:
#!/usr/bin/env nextflow
nextflow.preview.dsl = 2
process sayHello {
executor 'local'
container 'ubuntu:22.04'
output:
stdout
'''#!/bin/bash
echo "Hello from container! CPU cores: $(nproc)"
'''
}
workflow {
sayHello()
}
然后用 Nextflow 运行:
nextflow run hello.nf
如果看到输出类似:
N E X T F L O W ~ version 24.04.2
Launching `hello.nf` [distracted_perlman] DSL2 - revision: abc123
executor > local (1)
[5f/8e3c7d] process > sayHello [100%] 1 of 1 ✔
Hello from container! CPU cores: 4
说明 Nextflow 成功在容器里执行了命令。至此,环境搭建完毕。
下面这张表帮你快速对比 Docker 和 Singularity,方便你在不同场景下选择:
| 特性 | Docker | Singularity |
|---|---|---|
| 权限需求 | 需要 root 或 docker 组 | 普通用户即可运行 |
| 镜像格式 | Docker Image (层叠) | SIF (单一文件) |
| HPC 兼容性 | 多数集群不支持 | 主流 HPC 都支持 |
| 网络访问 | 默认隔离 | 默认共享宿主机网络 |
| GPU 支持 | 需额外配置 nvidia-docker | 原生支持(--nv 参数) |
| 镜像来源 | Docker Hub 丰富 | 可转换 Docker 镜像 |
一句话总结:本地开发用 Docker 最方便,部署到集群用 Singularity 最省心。Nextflow 两者都支持,配置文件里切换几乎零改动。
环境搭完了,别急着往下冲。我建议你先跑一遍上面的 hello.nf,确保每一步都走通。因为后面所有的 RNA-seq 定量流程都依赖这个基础。嗯,我曾经在装 Singularity 时忽略了一个依赖库,结果跑 pipeline 时卡在容器拉起阶段,浪费了一下午排查。所以验证这一步真不能省。