我在使用 Docker 构建我的 Snakemake 工作流程时遇到了一些麻烦。
简单地说,我正在尝试对“Snakemake 位”(例如:snakefile、脚本等)进行 dockerize,并独立对每个环境进行 dockerize。我希望这样做是为了可移植性和测试——单一、庞大的 Docker 镜像很难使用 CI/CD 工具进行管理。我将经常构建和部署我的管道 - >10 GB 的 Docker 映像很难或不可能在许多 CI/CD 平台上使用。我的 env docker 镜像将相对稳定,很少需要重建(例如:仅包含 samtools)。
例如,假设我有一个看起来像这样的 dockerfile:
FROM conda
RUN conda install snakemake
COPY my_repo
然后在蛇文件中,您的规则如下所示:
rule example:
input: "data"
output: "different_data"
container: "docker://repo/env"
script: "script.py"
我相信最初的容器本身需要有 Docker,这似乎不正确并且过于复杂。将 Snakemake 部分“不”保存在容器中也并不理想 - 这些管道需要非常便携。即,一个容器将成为协调其他容器的“主”容器。 目前我正计划在 Docker 之外研究 Docker(DooD,安装本地 docker 套接字),但是是否有更干净的方法来实现我想要的?
编辑:据我所知(如果我错了请纠正我)Snakemake只使用Apptainer/Singularity,而不使用Docker。不过这篇文章中的其他内容仍然保持不变。
[ Host Machine ]
|
|----[ Master Container (Snakemake + Docker CLI) ]
|
|----[ Worker Container 1 (Environment 1) ]
|
|----[ Worker Container 2 (Environment 2) ]
|
|----[ ]
您的主容器将基于轻量级映像,但必须包含Snakemake
和 Docker CLI。 Docker CLI 对于从主容器内管理其他容器是必需的。
FROM debian:buster-slim
# Install Docker CLI and other dependencies
RUN apt-get update && \
apt-get install -y curl python3 python3-pip && \
curl -fsSL https://get.docker.com -o get-docker.sh && \
sh get-docker.sh && \
apt-get install -y docker-ce-cli
# Install Snakemake using pip
RUN pip3 install snakemake
# Copy your Snakemake workflow files into the container
COPY . /workflow
WORKDIR /workflow
通过将主机的 Docker 套接字安装到主容器中,在 Docker (DooD) 之外使用Docker。这允许主容器与主机的 Docker 守护进程通信以管理工作容器。
docker run -v /var/run/docker.sock:/var/run/docker.sock -it my_master_container
Singularity (Apptainer)
等容器技术,而不是 Docker。然而,对于 Docker 兼容性,特别是在 CI/CD 管道和云环境中,上述策略(在主容器内使用 Docker CLI)可以解决此限制。