【问题标题】:Containerize a conda environment in a Singularity container在 Singularity 容器中容器化 conda 环境
【发布时间】:2019-02-13 20:22:32
【问题描述】:

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

【问题讨论】:

    标签: conda hpc singularity-container


    【解决方案1】:

    首先,您需要为您的特定 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 ' ') 更改为环境名称。

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

    【讨论】:

    • 我试过了,在“运行”之后我得到了这个错误:singularity run conda.simg conda -hhead: cannot open 'env.yaml' for reading: No such file or directory
    • @AndreaT。这是 echo "source activate $(...)" > ~/.bashrc 命令未正确执行的问题。您可以硬编码 head/cut 命令的结果并重试。
    • @compBio 谢谢,如果我有 root 访问权限,这可以正常工作。如果我只是本地用户,是否知道是否有解决方法?
    • @ATpoint Singularity 具有“假根”功能,可以解决您的问题。不过,我对此并不熟悉。前任。 'singularity build --fakeroot /tmp/test.sif /tmp/test.def'
    【解决方案2】:

    我发现它很有用,因为您可以安装一个装有 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
      

    【讨论】:

      【解决方案3】:

      使用 conda-pack 可以将现有的 conda 环境容器化,而无需从 environment.yml 重新创建它们。当环境不再解析时,或者在没有 conda 的情况下将软件包安装到环境中时,这特别有用,例如使用Rinstall.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 机器上时才有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-11
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多