如何在Snakemake的Singularity容器内加载环境变量脚本
Snakemake调用Singularity时自动加载容器环境的配置方法
问题场景
使用Snakemake结合Singularity运行工作流时,出现容器内命令找不到的报错。
初始规则定义如下:
rule all: singularity: "./ubuntu.sif" output: "tmp.txt" shell: """ python --version >> tmp.txt """
执行命令snakemake -c1 --use-singularity触发报错,提示python命令不存在:
Activating singularity image ./ubuntu.sif /usr/bin/bash: line 2: python: command not found [Sun Jul 10 17:10:04 2022] Error in rule all: jobid: 0
需要实现Snakemake启动Singularity容器时自动执行source /some/path/to/env.sh加载环境,排除两种已知不可用方案:
- 手动在shell块中写全
singularity exec硬编码解释器路径,该方式不规范,无法复用Snakemake自带的容器路径挂载、工作目录映射能力 - 修改容器内
.singularity.d目录下的启动配置,该操作需要root权限,当前环境不支持
可行配置方案
方案1:通过shell.prefix配置规则级/全局前置执行命令
Snakemake原生支持shell.prefix配置,配置的内容会自动拼接在所有shell块命令的最前面执行,不需要修改容器,也不需要调整执行命令。
单规则使用写法:
rule all: singularity: "./ubuntu.sif" output: "tmp.txt" shell.prefix: "source /some/path/to/env.sh && " shell: """ python --version >> tmp.txt """
如果工作流内所有使用该容器的规则都需要加载环境,可以把prefix配置抽成全局配置,或者封装为公共规则片段复用,避免重复编写。
方案2:配置Singularity用户级环境变量实现自动加载
Singularity支持用户级的SINGULARITY_BASH_ENV参数,容器启动时会自动source该参数指向的脚本,完全不需要root权限,也不需要修改Snakemake规则文件。
执行snakemake前在终端导出环境变量即可:
export SINGULARITY_BASH_ENV=/some/path/to/env.sh snakemake -c1 --use-singularity
如果需要长期生效,把上述export语句写入当前用户的~/.bashrc文件即可,该配置仅对当前用户生效,不会影响其他用户或者容器本身的内容。
两种方案都保留了Snakemake原生的Singularity调度逻辑,自动处理工作目录映射、输入输出文件路径挂载等操作,比手动写
singularity exec的方式兼容性更好,也更符合Snakemake的使用规范。
内容的提问来源于stack exchange,提问作者ipcamit
相关产品推荐
相关产品推荐

