【WSL】Docker镜像上传
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/script2.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 python3shebang 和可执行权限,可直接被 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
更多推荐
所有评论(0)