11

我遇到过几个实例,其中容器化 conda 环境以实现长期可重复性非常有帮助。由于我通常在高性能计算系统中运行,出于安​​全原因,它们需要是 Singularity 容器。如何才能做到这一点?

4

3 回答 3

19

首先,您需要为您的特定 conda 环境获取环境 YML。

conda activate your_env
conda env export > environment.yml

这是一个示例 Singularity 配方(在与“environment.yml”相同的目录中名为“Singularity”的文件中):

Bootstrap: docker

From: continuumio/miniconda3

%files
    environment.yml

%post
    /opt/conda/bin/conda env create -f environment.yml

%runscript
    exec /opt/conda/envs/$(head -n 1 environment.yml | cut -f 2 -d ' ')/bin/"$@"

构建这个

sudo singularity build conda.sif Singularity

现在,您将拥有一个使用 conda 环境中的库的功能容器,该容器可以在安装了 Singularity 的任何地方运行!

例子:

singularity run conda.sif ipython

笔记:

根据您使用的 Singularity 版本,您可能需要将 $(head -n 1 environment.yml | cut -f 2 -d ' ') 更改为环境名称。

由于您无法从运行脚本激活环境,因此您将被限制为使用提供的运行脚本安装在特定环境中的二进制文件。

于 2019-02-13T20:22:32.187 回答
3

我发现它很有用,因为您可以安装一个装有 anaconda3 环境的容器,并随时为您的不同项目轻松创建新环境。

这很简单,我将逐步介绍:

  1. 通过以下定义文件在本地计算机中创建容器(您可以随意命名。请注意,有些行可能是可以避免的):

    Bootstrap: library
    From: ubuntu:18.04
    Stage: build
    
    %post
    
    apt-get update && apt-get -y upgrade
    apt-get -y install \
    build-essential \
    wget \
    bzip2 \
    ca-certificates \
    libglib2.0-0 \
    libxext6 \
    libsm6 \
    libxrender1 \
    git
    rm -rf /var/lib/apt/lists/*
    apt-get clean
    #Installing Anaconda 3 
    wget -c https://repo.anaconda.com/archive/Anaconda3-2020.02-Linux-x86_64.sh
    /bin/bash Anaconda3-2020.02-Linux-x86_64.sh -bfp /usr/local
    #Conda configuration of channels from .condarc file
    conda config --file /.condarc --add channels defaults
    conda config --file /.condarc --add channels conda-forge
    conda update conda
    #List installed environments
    conda list
    
  2. 然后,为了构建容器,运行以下命令:

    sudo singularity build ContainerName.sif YourDefineFile.def
    
  3. 现在您可以创建您的 conda env(您可以使用常用方法或通过 YML 文件创建它,该文件是从现有环境中导出的文件)

    例如,我使用 YML 文件进行操作:首先,您需要进入 .sif 容器,如下所示:

     Singularity shell YourContainerName.sif 
    

    进而:

     conda env create --name envname --file=YourEnvironments.yml
    
  4. 因此,创建 env 后,您可以使用以下命令激活它(同样首先您需要跳转到您的容器中):

    singularity shell YourContainer.Sif
    
    source activate YourEnvName
    
于 2020-04-15T15:08:49.137 回答
2

使用conda-pack可以将现有的 conda 环境容器化,而无需从environment.yml. 当环境不再解析时,或者在没有 conda 的情况下将软件包安装到环境中时,这尤其有用,例如使用R's install.packages

  1. 打包环境

    conda-pack -n <MY_ENV> -o packed_environment.tar.gz
    
  2. 创建这个Singularity文件

    
    Bootstrap: docker
    
    From: continuumio/miniconda3
    
    %files
        packed_environment.tar.gz /packed_environment.tar.gz
    
    %post
        tar xvzf /packed_environment.tar.gz -C /opt/conda
        conda-unpack
        rm /packed_environment.tar.gz
    
  3. 构建图像

    singularity build --fakeroot <OUTPUT_CONTAINER.sif> Singularity
    

有关更多详细信息,包括 Docker/Podman 变体,请查看我的grst/containerize-conda存储库。

限制:该方法可能仅在源环境位于 linux x64 机器上时才有效。

于 2021-03-12T10:40:06.853 回答