【问题标题】:Automatically source configuration when running Singularity container with "shell" command使用“shell”命令运行 Singularity 容器时自动源配置
【发布时间】:2019-10-14 22:29:57
【问题描述】:

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

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

> source /setup.bash
> build_command

我想知道当我使用singularity shell 运行容器时,是否有办法让奇点自动获取/setup.bash 文件。我尝试使用定义文件中的%environment 部分,但似乎无法在那里创建别名。

【问题讨论】:

    标签: singularity-container


    【解决方案1】:

    别名不会在子shell 之间继承,因此目前无法通过$SINGULARITY_ENVIRONMENT%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

    From the docs:

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

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

    【讨论】:

    • 这似乎和%environment部分有同样的问题:它确实是在打开容器时来源的(我通过添加echo进行验证)但是在那里创建的别名不存在于打开的实际外壳。
    • 啊,没错。使用exec 启动shell 以接管PID,但仅使用导出的环境。别名永远不会被子shell 继承。您可以使用函数而不是别名并使用export -f func_name 导出它们。但是,基于 debian 的图像仍然存在问题,因为 /bin/sh 是指向 /bin/dash 的符号链接,不支持 export -f
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    相关资源
    最近更新 更多