安装与配置 Nextflow(包括 Singularity/Docker)

说实话,每次开始一个新的生物信息项目,我最先做的一件事就是确认 Nextflow 和容器环境是不是跑通了。很多小伙伴急着写 pipeline,结果在环境配置上卡了一整天——嗯,我早期也没少踩这个坑。这一章咱们就把它彻底搞定。

安装 Nextflow:三种主流方式

Nextflow 本质上是一个 Java 应用,所以只要系统上有 Java 8 或更高版本就能跑。我个人习惯用 curl 直接下载,干净利落。

# 方法一:curl 安装(推荐)
curl -s https://get.nextflow.io | bash

# 方法二:用 wget
wget -qO- https://get.nextflow.io | bash

下载完会得到一个 nextflow 可执行文件,我建议把它放到 /usr/local/bin 或者 ~/bin 下,方便全局调用。另外,很多同学在集群上没有 sudo 权限,那就放到自己的 $HOME/bin 并加到 PATH 里。

如果你喜欢用 conda 管理生物信息软件,也可以这样装:

# 方法三:conda 安装
conda install -c bioconda nextflow

为什么要优先选 curl/wget 方式?

conda 里的版本有时滞后,而且经常要等依赖解析。我遇到过 conda 装了个 20.x 旧版,而新 pipeline 要求 22.x 以上——折腾了半天才发现是版本问题。所以我现在都用官方脚本直接拿最新版。

环境变量设置:让 Nextflow 找到家

装完 Nextflow 后,别忘了配置两个关键环境变量。我习惯把它们写进 ~/.bashrc 或 ~/.profile 里:

# 加入 PATH(如果你没把 nextflow 放到系统目录)
export PATH=$HOME/bin:$PATH

# 指定 Nextflow 的家目录(缓存、临时文件放这里)
export NXF_HOME=$HOME/.nextflow

NXF_HOME 默认是 $HOME/.nextflow,但如果你在集群上共享家目录,我建议把 NXF_HOME 指向一个本地 SSD 或 tmp 盘,避免 I/O 瓶颈。

小技巧:每次配完环境变量,记得 source ~/.bashrc 或重新登录终端。然后跑一下 nextflow info 看看版本。

安装容器引擎:Docker 与 Singularity

容器是 Nextflow 实现可复现性的基石。下面说说两种主流引擎的安装——我个人的经验是:本地开发用 Docker,集群/ HPC 用 Singularity。

Docker 安装(适用于个人电脑或小型服务器)

在 Ubuntu 上,标准的安装步骤是:

# 更新包索引
sudo apt-get update

# 安装依赖
sudo apt-get install ca-certificates curl gnupg

# 添加 Docker 官方 GPG 密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 设置稳定版仓库
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装 Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

# 验证
sudo docker run hello-world

我曾经踩过的坑:装完 Docker 后,普通用户直接运行 docker ps 会报权限错误。

解决方法:

sudo usermod -aG docker $USER
# 注销并重新登录,或者 newgrp docker 使其生效

注意:docker 组的权限等同于 root,在共享集群上建议谨慎使用。

Singularity 安装(适用于 HPC 集群)

Singularity(现在叫 Apptainer)在生物信息 HPC 里几乎成了标配。因为用户没有 root 权限,而 Singularity 不需要 daemon,可以直接运行。

# 在 Ubuntu 上安装 SingularityCE(社区版)
# 先安装 Go(如果编译的话,但推荐直接用二进制包)
sudo apt-get update
sudo apt-get install wget

# 下载预编译二进制(以 4.0 为例)
wget https://github.com/sylabs/singularity/releases/download/v4.0.0/singularity-ce_4.0.0-focal_amd64.deb
sudo dpkg -i singularity-ce_4.0.0-focal_amd64.deb

# 验证安装
singularity version

如果你在 CentOS / Rocky Linux 上,可以用 RPM 包。另外很多 HPC 集群已经预装了 Singularity,你可以直接 which singularity 或者 module load singularity。

对比 Docker vs Singularity(生物信息场景)

特性 Docker Singularity
需要 root 权限? 需要(除非用 rootless 模式) 不需要,普通用户即可运行
守护进程 需要后台 dockerd 无守护进程,直接执行
GPU 支持 需要 nvidia-docker2 原生支持 --nv 参数
与 SLURM 集成 较复杂(需 sudo 或 rootless) 原生集成,HPC 友好
镜像格式 分层镜像 单文件 .sif 格式,方便分发

配置 Nextflow 使用容器

Nextflow 通过 nextflow.config 文件来指定用哪种容器引擎。最常用的方式是在项目根目录下创建一个配置文件。我习惯把容器相关的设置单独抽出来:

// nextflow.config(放在 pipeline 目录下)
process {
    container = 'biocontainers/fastqc:v0.11.9_cv1'
    // 或者让 Nextflow 自动从 Docker Hub 拉取
}

docker {
    enabled = true
    // 如果要用 Singularity,改为 false 并启用 singularity
}

singularity {
    enabled = false
    // autoMounts = true   // 自动挂载常用目录(如 /tmp)
}

当你同时装了 Docker 和 Singularity 时,可以通过 docker.enabled 和 singularity.enabled 来切换。如果两个都设为 true,Nextflow 会优先使用 Docker。

实用技巧:在 HPC 上提交作业时,通过命令行参数覆盖配置更方便:

nextflow run main.nf -with-singularity   # 强制使用 Singularity

验证安装与配置是否正常

跑一个小测试是最保险的。我通常会拿 nf-core 的 hello pipeline 来检验:

# 先确保 Nextflow 能用
nextflow run hello

# 如果你配置了 Docker,试试用容器跑
nextflow run nf-core/fetchngs -profile test,docker --outdir ./test_result

# 检查进程是否真的走容器了(看日志里的 container 字段)

如果一切顺利,你会看到 Nextflow 自动下载镜像,然后每个 process 在容器中执行。万一遇到 docker: command not found 或者 singularity: command not found,八成是 PATH 没配好。

本章知识体系

安装与配置 Nextflow·容器环境 安装选择 curl / wget 下载 conda 安装 手动二进制 环境变量配置 容器引擎安装 Docker(含用户组配置) Singularity nextflow.config 开关配置 Java≥8 前提 NXF_HOME 设置

配置完成后,建议随手做一次端到端检查:

  1. nextflow info 确认版本
  2. docker run hello-world 或 singularity run hello-world.sif 确认容器引擎正常
  3. 用一个小 pipeline(比如 nf-core/hello)跑通 -with-docker 或 -with-singularity