在 Singularity 容器中容器化 conda 环境
Containerize a conda environment in a Singularity container
我遇到过几个实例,在这些实例中,将 conda 环境容器化以实现长期可重复性确实很有帮助。由于我通常 运行 在高性能计算系统中,出于安全原因,它们需要是 Singularity 容器。如何做到这一点?
首先,您需要为特定的 conda 环境获取环境 YML。
conda activate your_env
conda env export > environment.yml
这是一个奇点配方示例(在与 '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 ' ')。
由于您无法从 运行 脚本激活环境,因此您只能使用提供的 运行 脚本安装在特定环境中的二进制文件。
我发现它很有用,因为您可以安装一个装有 anaconda3 环境的容器,并随时为您的不同项目轻松创建新环境。
这个很简单,我会一步步过一遍:
通过以下定义文件在您的本地机器上创建容器(您可以随意命名它。请注意,有些行可能是可以避免的):
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
然后,为了构建容器,运行以下命令:
sudo singularity build ContainerName.sif YourDefineFile.def
现在你可以创建你的conda env了(你可以使用常用的方法或者通过YML文件创建它,它是从现有环境中导出的文件)
比如我用一个yml文件做的:
首先,您需要进入您的 .sif 容器,如下所示:
Singularity shell YourContainerName.sif
然后:
conda env create --name envname --file=YourEnvironments.yml
因此,在您的环境创建后,您可以使用以下命令激活它(同样首先您需要跳入您的容器):
singularity shell YourContainer.Sif
source activate YourEnvName
使用 conda-pack 可以容器化现有的 conda 环境,而无需从 environment.yml
重新创建它们。当环境不再解析时,或者在没有 conda 的情况下将包安装到环境中时,这尤其有用,例如使用 R
的 install.packages
.
打包环境
conda-pack -n <MY_ENV> -o packed_environment.tar.gz
创建此 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
构建图像
singularity build --fakeroot <OUTPUT_CONTAINER.sif> Singularity
有关更多详细信息,包括 Docker/Podman 变体,请查看我的 grst/containerize-conda 存储库。
限制:该方法可能仅在源环境位于 linux x64 计算机上时才有效。
我遇到过几个实例,在这些实例中,将 conda 环境容器化以实现长期可重复性确实很有帮助。由于我通常 运行 在高性能计算系统中,出于安全原因,它们需要是 Singularity 容器。如何做到这一点?
首先,您需要为特定的 conda 环境获取环境 YML。
conda activate your_env
conda env export > environment.yml
这是一个奇点配方示例(在与 '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 ' ')。
由于您无法从 运行 脚本激活环境,因此您只能使用提供的 运行 脚本安装在特定环境中的二进制文件。
我发现它很有用,因为您可以安装一个装有 anaconda3 环境的容器,并随时为您的不同项目轻松创建新环境。
这个很简单,我会一步步过一遍:
通过以下定义文件在您的本地机器上创建容器(您可以随意命名它。请注意,有些行可能是可以避免的):
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
然后,为了构建容器,运行以下命令:
sudo singularity build ContainerName.sif YourDefineFile.def
现在你可以创建你的conda env了(你可以使用常用的方法或者通过YML文件创建它,它是从现有环境中导出的文件)
比如我用一个yml文件做的: 首先,您需要进入您的 .sif 容器,如下所示:
Singularity shell YourContainerName.sif
然后:
conda env create --name envname --file=YourEnvironments.yml
因此,在您的环境创建后,您可以使用以下命令激活它(同样首先您需要跳入您的容器):
singularity shell YourContainer.Sif source activate YourEnvName
使用 conda-pack 可以容器化现有的 conda 环境,而无需从 environment.yml
重新创建它们。当环境不再解析时,或者在没有 conda 的情况下将包安装到环境中时,这尤其有用,例如使用 R
的 install.packages
.
打包环境
conda-pack -n <MY_ENV> -o packed_environment.tar.gz
创建此
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
构建图像
singularity build --fakeroot <OUTPUT_CONTAINER.sif> Singularity
有关更多详细信息,包括 Docker/Podman 变体,请查看我的 grst/containerize-conda 存储库。
限制:该方法可能仅在源环境位于 linux x64 计算机上时才有效。