1.安装WSL

【学习记录】Docker初探(1)_docker wsl是什么-CSDN博客

2.安装SDKMAN

路径

路径,在wsl的ubuntu中可以直接进入windows中的文件夹,原路径前面加上/mnt/,如:

/mnt/d/demo/bio_pipeline

安装

curl -s "https://get.sdkman.io" | bash
source "/root/.sdkman/bin/sdkman-init.sh"
sdk version

如果已经安装失败过,卸载后重新安装sdkman

rm -rf /root/.sdkman
curl -s "https://get.sdkman.io" | bash
source "/root/.sdkman/bin/sdkman-init.sh"
sdk version

可以用SDKMAN来安装和管理各种 JDK 版本、Groovy、Scala、Maven 等工具。例如:

列出可用的 Java 版本:sdk list java
安装某个 Java 版本:sdk install java 17.0.12-tem(以 Eclipse Temurin 17 为例)
设置默认 Java 版本:sdk default java 17.0.12-tem
查看帮助:sdk help

3.安装nextflow

检查是否有java环境,没有的话安装一下

java -version
sdk install java 17.0.12-tem

下载并安装 Nextflow 执行以下命令,它会下载一个能自我安装的启动器文件

curl -s https://get.nextflow.io | bash

放home目录下并且加入环境

# 创建用户本地 bin 目录
mkdir -p $HOME/.local/bin
​
# 移动 nextflow 文件
mv nextflow $HOME/.local/bin/
​
# 将目录添加到 PATH
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
​
# 重新加载配置
source ~/.bashrc

查看是否安装成功

nextflow -version

4.python环境配置

路径,在wsl的ubuntu中可以直接进入windows中的文件夹,如:

/mnt/d/demo/bio_pipeline

更新系统,安装软件

# 更新软件包列表并升级已安装的包
sudo apt update && sudo apt upgrade -y
​
# 安装 wget,如果已经安装可以跳过
sudo apt install wget -y

安装anconda,然后选择pyhton版本在环境中安装python包,同时,也可以在anconda中安装nextflow

wget https://repo.anaconda.com/archive/Anaconda3-2025.12-2-Linux-x86_64.sh
​
bash Anaconda3-2025.12-2-Linux-x86_64.sh
​
conda create -n nextflow_env python=3.13.9

常用shell命令

# 查看内核版本和系统架构信息
uname -a 
# 查看已创建环境
conda env list
# 创建
conda create -n nextflow_env python=3.13.9
# 激活
conda activate nextflow_env
# 生成文件
touch filename
# vim写入
vim filename
# 生成文件夹
mkdir 目录名
# 删除文件夹
# -r或 -R:递归删除目录及其中所有内容
rm -r 目录名
# 安装和配置nextflow
conda install -c bioconda nextflow

Windows 换行符 (CRLF) 问题

注意:脚本第一行的 #!/usr/bin/env python3 后面多了一个 \r,导致系统找不到 python3\r 这个解释器

sed -i 's/\r$//' bin/deg_analysis.py

或者安装unix格式转换软件,将脚本格式从 CRLF 转换为 LF

# 安装 dos2unix
sudo apt update && sudo apt install dos2unix -y
# 转换脚本文件
dos2unix bin/deg_analysis.py
dos2unix bin/enrichment.py

5.nextflow工作流

运行一个自带的流程

nextflow run hello

写一个简单的示例nextflow流程

nextflow流程由两部分组成:
1.process 流程名{}:流程名自己取。
{}里面是一次运行的代码,可以将workflow{}中的多组参数分多次传入流程中重复运行
process由三部分组成:input/output/script

2.workflow{}:设置多组传入参数
 这里是从workflow{}分批次读入字符串,作为val x 然后进行操作echo '$x world!' 关键是写script的操作
 3.然后workflow{}中设置需要分析的数据,以Channel.of形式传入 sayHello | 进行展示view

基础命令

mkdir filename
cd filename
touch local_hello.nf

构建一个.nf格式的脚本,放入nextflow命令

touch local_hello.nf
vim local_hello.nf

在nf中输入运行代码

:wq
cat  local_hello.nf
nextflow run local_hello.nf

 process sayHello {                                                          
     input:                                                                    
       val x
     output:
       stdout                                                       
     script:                                                                   
 """                                                                     
     echo '$x world!'                                                        
     """                                                                     
 }
 workflow {
   Channel.of('Bonjour', 'Ciao', 'Hello', 'Hola') | sayHello | view
 }
 

示例项目

/── bin/                           # 运行脚本
│   ├── deg_analysis.py
│   ├── enrichment.py
├── data/                          # 示例数据
│   ├── counts1.txt
│   └── meta1.txt
└── runmain2.nf                     # Nextflow 流程脚本  

runmain2.nf:

nextflow.enable.dsl=2
​
process DEG {
    publishDir "./results", mode: 'copy', overwrite: true
​
    input:
    tuple path(count_matrix), path(sample_info)
​
    output:
    path "deg_results.csv"
​
    script:
    """
    deg_analysis.py \
        --counts $count_matrix \
        --meta $sample_info \
        --out deg_results.csv
    """
}
​
process ENRICH {
    publishDir "./results", mode: 'copy', overwrite: true
​
    input:
    path deg
​
    output:
    path "enrichment.csv"
​
    script:
    """
    enrichment.py \
        --deg $deg \
        --out enrichment.csv
    """
}
​
workflow {
    // 输入通道
    input_ch = Channel.of(
        tuple(
            file("data/counts1.txt"),
            file("data/meta1.txt")
        )
    )
​
    // 运行 DEG,得到 deg_results.csv 的通道
    deg_ch = DEG(input_ch)
​
    // 将 deg_ch 传递给 ENRICH
    ENRICH(deg_ch)
}

运行

conda activate nextflow_env
nextflow run runmain2.nf

6.上传docker hub

结构

/workspace/
├── bin/                           # 运行脚本
│   ├── deg_analysis.py
│   ├── enrichment.py
├── data/                          # 示例数据
│   ├── counts1.txt
│   └── meta1.txt
├── runmain2.nf                     # Nextflow 流程脚本
└── environment.yml                  # 环境定义文件

关键文件说明

  • Dockerfile:定义了如何从基础镜像构建出包含完整环境的镜像,包括安装系统工具、SDKMAN、Java、Nextflow、Conda 环境,并复制项目文件。

  • environment.yml:定义了 Conda 环境的依赖包(pandas, scipy, requests 等),通过 pip 安装 gseapy。

  • runmain2.nf:实现了 DEG → ENRICH 的线性流程,是镜像默认运行的主脚本

  • bin/ 下的 Python 脚本:每个脚本对应一个 Nextflow 进程,具有 #!/usr/bin/env python3 shebang 和可执行权限,可直接被 Nextflow 调用。

Dockerfile

FROM continuumio/miniconda3:latest
WORKDIR /workspace
​
# 安装系统依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
    curl \
    wget \
    procps \
    unzip \
    zip \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*
​
# 单独安装 SDKMAN
RUN curl -s "https://get.sdkman.io" | bash
​
# 单独安装 Java 21
RUN bash -c "source /root/.sdkman/bin/sdkman-init.sh && sdk install java 17.0.12-tem && sdk default java 17.0.12-tem"
​
# 设置 Java 环境变量
ENV JAVA_HOME="/root/.sdkman/candidates/java/current" \
    PATH="/root/.sdkman/candidates/java/current/bin:${PATH}"
​
# 安装 Nextflow
RUN curl -s https://get.nextflow.io | bash \
    && mv nextflow /usr/local/bin/
​
# 创建 Conda 环境
COPY environment.yml /workspace/
RUN conda env create -f environment.yml
ENV PATH="/opt/conda/envs/nextflow_env/bin:${PATH}"
​
# 复制项目文件
COPY bin/ /workspace/bin/
COPY data/ /workspace/data/
COPY runmain2.nf /workspace/
RUN chmod +x /workspace/bin/*.py
​
CMD ["/bin/bash"]

environment.yml

name: nextflow_env
channels:
  - conda-forge
  - defaults
dependencies:
  - python=3.10
  - pandas
  - scipy
  - requests
  - pip
  - pip:
    - gseapy
    - numpy

容器构建和推送

进入存放脚本的文件夹中,运行

docker build --no-cache -t sword950/nextflow-pipeline:v2 .

构建成功后显示:[+] Building 551.4s (17/17) FINISHED

推送镜像

docker push sword950/nextflow-pipeline:v2

注意事项

work/ 目录在镜像构建时不会包含,它们是在容器内运行 Nextflow 时动态生成并挂载或复制的。若需要持久化输出,应在运行容器时通过 -v 将宿主目录挂载到容器内的 /workspace/results

更多推荐