如何在蛇形容器中加载环境变量脚本



考虑以下snakemake规则:

rule all:
singularity: "./ubuntu.sif"
output: "tmp.txt"
shell: """
python --version >> tmp.txt
"""

当我作为snakemake -c1 --use-singularity运行它时,它给出了一个错误,因为python解释器不在容器的PATH中。

Activating singularity image ./ubuntu.sif
/usr/bin/bash: line 2: python: command not found
[Sun Jul 10 17:49:04 2022]
Error in rule all:
jobid: 0

如何让snakemake运行"source/some/path/to/envy .sh"奇点容器的指令?


我知道我可以运行规则

rule all:
output: "tmp.txt"
shell: """
singularity exec ./ubuntu.sif /path/to/python --version >> tmp.txt
"""

但比起提供简单的"奇点",这似乎是一个更俗气的解决方案。参数。这就是人们目前使用它的方式。我没有root权限,所以我不能修改容器的.singularity.d内容。

与其尝试侧加载一个特殊的环境,不如这样问:为什么在PATH不是?


答案1:您正在调用python而不是python3

Ubuntu使用明确版本的python2/python3二进制文件,除非符号链接是手动或通过python[23]-is-python包创建的。尝试使用python3 --version而不是python --version


答案2:您的本地PATH变量覆盖了容器环境

我不确定snakemake是如何处理这个问题的,但默认情况下,奇点使它在容器内执行的完整环境可用。这使得运行一个奇点镜像更像运行一个shell脚本,而不是像运行Docker容器那样运行一个完全独立的环境。

你可以在调用奇点时使用--cleanenv/-e标志,以确保只有SINGULARITYENV_*变量被转发到容器环境。