2. 环境搭建:安装 Nextflow 和 Docker/Singularity

好,开始动手了。这一章咱们把武器装上——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
小提示:如果你的系统还没有 Java 11+,记得先装 OpenJDK。我遇到过用户机器上 Java 8 跑 Nextflow 报错的情况。建议装 OpenJDK 11 或 17。

如果你用 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!" 就对了
注意:我曾经有次忘了加用户组,直接在 Nextflow 里调用 Docker 一直报权限错,排查了半天。嗯,加入 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 成功在容器里执行了命令。至此,环境搭建完毕。

环境搭建知识结构 操作系统(Linux / macOS / WSL2) Docker 本地开发首选 Singularity HPC 集群专用 Nextflow 工作流引擎 + 容器编排 最终目标:可复现的 RNA-seq 定量

下面这张表帮你快速对比 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 时卡在容器拉起阶段,浪费了一下午排查。所以验证这一步真不能省。