奇点容器:将自定义包添加到 $PATH 并将其传递给奇点执行程序

Singularity containers: adding custom packages to $PATH and pass it to singularity exec

我正在制作一个奇点容器,其中装有 PLINK v 1.9(一种遗传学软件,不是 PuTTY 界面,https://www.cog-genomics.org/plink/1.9/dev)。我能够在容器内成功编译软件,当我 shell 进入容器时,我可以看到 PLINK 文件和函数。为了让我的最终用户更轻松,我试图将软件的主文件夹添加到奇点 $PATH,以便他们可以从命令行调用 plink,但我无法实现这一点。

到目前为止我已经尝试过:

  1. 在我的奇点配方文件的 %运行 脚本部分分配 SINGULARITYENV_APPEND_PATH=path/to/plink。
  2. 将 Plink 的源代码文件夹移动到 Singularity
  3. 的 /usr/local/bin
  4. 设置变量 PLINKDIR=/path/to/plink 并将其导出到我的配方文件的 %environment 部分,类似于他们所做的 here.

None 这些方法有效。我可以访问此包的唯一方法是在我的 singularity exec 命令中拼出完整路径。

singularity exec test.simg /path/to/plink/plink --version 

我只想 运行

singularity exec test.simg plink --version 

我的奇点配方文件的内容:

    BootStrap: docker
    From: ubuntu:16.04

    %labels
  Plink Version 1.9


%runscript
  # Allows us to run the versions of the packages installed in the post
  # section
  exec plink19 "$@"

%environment
  export SINGULARITYENV_PLINKDIR="/plink-ng-b15c19f/1.9/"

%post
  # Make some directories for storage
  mkdir /new_folder_1 /new_folder_2
  apt-get update
  apt-get -y upgrade

  apt-get install -y --no-install-recommends \
        software-properties-common \
        build-essential \
        apt-transport-https \
        curl \
        git \
        wget \
        libfreetype6-dev \
        pkg-config \
        python \
        python-dev \
        dh-autoreconf \
        libarchive-dev \
        libatlas-dev \
        libatlas-base-dev \
        zlib1g-dev


  # Install PLINK
  wget https://github.com/chrchang/plink-ng/archive/b15c19f.tar.gz
  tar xvf b15c19f.tar.gz
  cd /plink-ng-b15c19f/1.9/
  ./plink_first_compile
  ln -s plink plink19

%test 
  echo $PLINKDIR

echo 语句不输出任何内容。我如何将这样的自定义包(意味着不是使用 apt-get 安装)添加到奇点环境,以便可以从命令行使用奇点 exec 调用它们?任何帮助,将不胜感激!

您应该可以将它添加到您的路径中:

%environment
    PATH=$PATH:/path/to/plink/

另外,编辑您的运行脚本:

%runscript
    exec "$@"

那么你可以运行:

singularity run test.simg plink --version

您消息的第一部分提到了 "so that they can just call plink from the command line, but I'm not able to achieve this." 在这种情况下,为什么不直接:

apt-get install -y plink1.9

在你的定义文件中?

在我的例子中,如果我尝试 singularity exec imgfile.sif plink --version 它显然不起作用,因为你必须调用 plink1.9 所以:singularity exec imagfile.sif plink1.9 --version