为了改善我的 Snakemake 工作流程的分布,我想将其 Docker 化。我通常部署软件堆栈的方式是通过 conda 环境(在项目文件夹的
.yaml
目录中另存为 envs/
文件)。然后,每个规则通过 conda:
指令和 --use-conda
标志(在执行时)调用它们,例如:
rule exampleRule:
input: input.file
output: output.file
conda:
os.path.join(workflow.basedir, "envs/<nameOfEnv>.yaml")
shell: "some shell command"
按照snakemake文档,我知道我可以使用以下命令Dockerize我的完整工作流程:
snakemake --containerize
。
生成的 Dockerfile 是这样的(这是一个人为的示例,实际上我有七个环境都构建在这个容器内):
FROM condaforge/mambaforge:latest
LABEL io.github.snakemake.containerized="true"
LABEL io.github.snakemake.conda_env_hash="dc12f3c8b1fb3caed02ab3305e24859bd63f4f1ea0c1ed29d71c857e7d0baaf5"
# Step 1: Retrieve conda environments
# Conda environment:
# source: envs/nameOfEnvironment.yaml
# prefix: /conda-envs/4e57ed29df8b6f849000ab15b5c719f2
# channels:
# - conda-forge
# - bioconda
# - anaconda
# - defaults
# dependencies:
# - wget
# - packageX == 5.3.0
# - packageY == 2.5.5
# - packageZ >= 1.1.1
RUN mkdir -p /conda-envs/4e57ed29df8b6f849000ab15b5c719f2
COPY envs/nameOfEnvironment.yaml /conda-envs/4e57ed29df8b6f849000ab15b5c719f2/environment.yaml
# Step 2: Generate conda environments
RUN mamba env create --prefix /conda-envs/4e57ed29df8b6f849000ab15b5c719f2 --file /conda-envs/4e57ed29df8b6f849000ab15b5c719f2/environment.yaml && \
mamba clean --all -y
我已经成功地遵循了这种方法,并构建了一个在 Dockerhub 上托管的映像,然后在 Snakefile 中引用该映像,例如
container: "docker://myDockerHub/myWorkflow_dockerimage:latest"
然后,当使用
--use-singularity
标志执行时,snakemake 将拉取此映像并构建环境。
问题是其余的执行似乎遵循类似的过程,就好像我没有使用过奇异性/docker一样。
这意味着为了以这种方式运行工作流程,我仍然需要安装一些基础软件包,尤其是 Snakemake 本身。这是否从一开始就违背了容器化工作流程的目的,或者我是否误解了一些基本的东西?
我能想到的唯一真正的解决方案是创建一个安装了 Snakemake 的镜像/容器。然后我将使用奇点运行此图像 - 但从那时起,我将从 Snakemake 图像中运行工作流程,就好像我没有对环境本身进行容器化一样。 从此图像中执行snakemake时,我无法使用
--use-singularity
标志,因为奇点本身在图像中不可用。
当我的目的是利用奇点时,在没有
--use-singularity
标志的情况下运行 Snakemake 似乎完全违反直觉。
正如评论中所指出的,这里问题的根源是您期望 Snakemake 容器化本身。这不是 Snakemake 容器化功能的目的——它们的存在是为了容器化您的pipeline。想要运行您的管道的人仍然需要手动安装 Snakemake(和 Singularity)。完成此操作后,当他们运行您的管道时,管道中的所有代码都将在指定的容器中运行。