首页 > 解决方案 > 使用“shell”命令运行 Singularity 容器时自动源配置

问题描述

我使用奇异容器(从定义文件构建)来构建我的项目的代码。我使用它的方式是运行容器,singularity shell my_container.sif使我的工作空间安装在容器中,然后运行命令以在那里构建。

为了使构建工作,我首先需要获取一个配置文件来设置环境,创建一些别名等。这个配置文件是容器的一部分。所以目前在容器内我执行以下操作:

> source /setup.bash
> build_command

我想知道/setup.bash当我使用singularity shell. 我尝试使用%environment定义文件中的部分,但似乎无法在那里创建别名。

标签: singularity-container

解决方案


别名不会在子 shell 之间继承,因此目前无法通过$SINGULARITY_ENVIRONMENTor传递这些别名%environment

一种选择是将别名转换为函数:

从:

alias build_command='pushd build_dir && ./configure && make && make install && popd'

至:

build_command() { pushd build_dir && ./configure && make && make install && popd ; }
export -f build_command

但是,Singularity/bin/sh默认使用初始环境处理,并且基于 Debian 的系统已/bin/sh符号链接到/bin/dash,并且 dash 不支持将函数导出到我发现的子 shell。如果使用 Debian 系列中的操作系统,您可能会被困在手动获取具有别名/函数的文件。


%post您的定义部分,您可以回显到$SINGULARITY_ENVIRONMENT.

从文档

%post
    apt-get update && apt-get install -y netcat
    NOW=`date`
    echo "export NOW=\"${NOW}\"" >> $SINGULARITY_ENVIRONMENT

在你的情况下,你会这样做echo "alias something='something else' >> $SINGULARITY_ENVIRONMENT。执行附加重定向很重要>>,因为您不想破坏现有的环境文件。


推荐阅读