考虑以下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_*
变量被转发到容器环境。