将 Docker 与 Snakemake 一起使用(受 Snakemake 文档的启发)并不能提供真正的 docker 容器?

问题描述 投票:0回答:1

为了改善我的 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 似乎完全违反直觉。

docker conda snakemake singularity-container
1个回答
0
投票

正如评论中所指出的,这里问题的根源是您期望 Snakemake 容器化本身。这不是 Snakemake 容器化功能的目的——它们的存在是为了容器化您的pipeline。想要运行您的管道的人仍然需要手动安装 Snakemake(和 Singularity)。完成此操作后,当他们运行您的管道时,管道中的所有代码都将在指定的容器中运行。

© www.soinside.com 2019 - 2024. All rights reserved.