Singularity(八)| conda实战
8.1 conda 和容器的区别
Conda
和容器技术(如Docker)都是现代软件开发和数据科学中常用的工具,用于解决环境依赖和应用部署的问题。尽管它们有着相似的目标,即确保应用可以在不同的环境中以一致的方式运行,但它们在设计和工作方式上有着根本的不同。
Conda 的主要目的是管理不同版本的软件包和创建虚拟环境,以便在同一计算机上安装和运行不同的软件包和库。它主要用于 Python 环境。
容器的主要目的是将整个应用程序及其依赖项打包成容器,以确保应用程序在不同环境中的一致性和
可移植性
。
隔离级别:
Conda:Conda 提供虚拟环境,通过创建独立的环境来隔离不同软件包的依赖关系,但它仍运行于操作系统之上,依赖于宿主机的操作系统和库(尽管通过环境可以实现一定程度的隔离)。
容器:与宿主机共享内核,在操作系统级别提供隔离,每个容器都有自己的文件系统、网络配置和隔离的进程空间。
8.2 在 Singularity 容器中配置 conda
实例1:构建 qiime1 容器
首先在容器中安装 miniconda
wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh
chmod u+x Miniconda3-latest-Linux-x86_64.sh
./Miniconda3-latest-Linux-x86_64.sh -b -p /opt/miniconda3
chmod --recursive a+rw /opt/miniconda3
必须注意的是,Singularity 容器内的进程默认以用户 root 的身份运行。这意味着 $HOME 被设置为 /root,此时,Miniconda 在默认情况下会被安装到 /root/miniconda3。
然而,root 目录只有 root 账号才能访问,即使里面的文件有 a+rx 权限。即如果我们将 conda 默认装到了容器内 root 目录下,我们将无法以非 root 账户使用容器内的 conda,
因此,conda 一定不能被安装在 /root 目录下
。
针对这一问题,
我们在使用 shell 修改容器时,最好添加
--no-home
参数。
安装 qiime1 及其依赖:
. ~/.bashrc
conda create -n qiime1 python=2.7
conda activate qiime1
apt-get install libfreetype6-dev libxft-dev
pip install matplotlib==1.4.3
pip install biom-format==2.1.4
pip install qiime
print_qiime_config.py -t
实例2:构建 qiime2 容器
下面还展示了一种直接利用 dockerfile 构建 qiime2 容器的方式:
FROM ubuntu:20.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && \
apt-get install -y \
apt-utils \
wget=1.20.3-1ubuntu1 \
git=1:2.25.1-1ubuntu3 && \
apt-get clean && \
rm -rf rm -rf /var/lib/apt/lists/* && \
wget https://repo.anaconda.com/miniconda/Miniconda3-py38_4.8.3-Linux-x86_64.sh && \
chmod +x Miniconda3-py38_4.8.3-Linux-x86_64.sh && \
./Miniconda3-py38_4.8.3-Linux-x86_64.sh -b -p /opt/miniconda3 && \
ln -s /opt/miniconda3/bin/conda /usr/bin/conda && \
wget https://data.qiime2.org/distro/core/qiime2-2020.8-py36-linux-conda.yml && \
conda env create -n qiime2-2020.8 --file qiime2-2020.8-py36-linux-conda.yml && \
conda install -y -n qiime2-2020.8 -c conda-forge -c bioconda -c qiime2 -c defaults q2cli q2templates q2-types q2-feature-table q2-metadata vsearch snakemake && \
chmod --recursive a+rw /opt/miniconda3 && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* && \
rm /qiime2-2020.8-py36-linux-conda.yml && \
rm /Miniconda3-py38_4.8.3-Linux-x86_64.sh
CMD ["/bin/bash"]
参考前面的方法,创建 docker 容器后转为 singularity。或是按上文中的方法直接从 dockerfile 到 singularity。
这样,
singularity exec ~/dockerimage.sif conda
就能正常运行,并显示 conda 的使用情况。然而,如果尝试执行其他一些命令,例如
singularity exec ~/dockerimage.sif conda run python -v
,我们会得到类似以下的错误信息:
OSError: [Errno 30] Read-only file system: '/opt/miniconda3/.tmp58csqy_a'
这是因为除了挂载的目录外,容器是不可变的。此外,运行
singularity exec ~/dockerimage.sif conda activate qiime2-2020.8
也会失败:
CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'. To initialize your shell, run
$ conda init <SHELL_NAME>
Currently supported shells are:
xonsh
powershell
See 'conda init --help' for more information and options.
IMPORTANT: You may need to close and restart your shell after running 'conda init'.
即使我们已经正确修改设置了 shell,我们仍然会得到以上结果。
8.3 使用 Singularity 容器中的 conda
针对以上问题,我们可以提供两种可能的解决方案,然而,这两个都存在很强的限制,目前来看,我们还无法完美的解决这一问题:
方式1:在容器内部运行
首先进入容器:
singularity shell ~/dockerimage.sif
然后在容器内部运行:
conda init
source .bashrc
export LC_ALL=C.UTF-8
export LANG=C.UTF-8
conda activate qiime2-2020.8
这一方法在我们具有 root 权限且只需要在本地运行程序时的体验很好。然而,在我们需要搭配 HPC 使用时非常困难。
方式 2:直接调用特定 conda 环境中的程序执行
例如,我们可以使用 def 文件创建一个包含 conda 的容器后,将参数直接传递给 conda 环境中的程序:
First, you'll want to
# get the environment YML
conda activate your_env
conda env export > environment.yml
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/"$@"
构建容器:
singularity build conda.sif
此时,我们可以直接调用容器内 conda 环境中的 ipython 解释器:
singularity run conda.sif ipython
# 或者使用conda环境中的绝对路径
singularity exec conda.sif /opt/conda/envs/.../bin/app
然而,这种方法无法激活 conda 环境,在某些情况下会遇到环境变量问题。
方式3:手动处理 conda 环境变量
较多情况下,激活 conda 环境的作用在于重新配置环境变量。
例如我们在 base conda 环境下安装某个应用,其软件依赖的可执行程序一般会被放置在 /opt/conda/bin 目录下,在 activate conda 环境后,/opt/conda/bin 目录就会被添加到环境变量中。
因此,在不激活 conda 环境的条件下,我们可以使用三种方式实现环境变量的配置:
(推荐)在调用容器前,添加需要的环境变量:
export PATH="/opt/conda/bin:$PATH"
在现存环境变量的路径下(例如:/usr/local/bin)为调用的软件依赖创建软链接:
ln -s /opt/conda/bin/curl /usr/local/bin/curl
直接修改源代码中的依赖路径为绝对路径。
8.1 conda 和容器的区别
Conda
和容器技术(如Docker)都是现代软件开发和数据科学中常用的工具,用于解决环境依赖和应用部署的问题。尽管它们有着相似的目标,即确保应用可以在不同的环境中以一致的方式运行,但它们在设计和工作方式上有着根本的不同。
Conda 的主要目的是管理不同版本的软件包和创建虚拟环境,以便在同一计算机上安装和运行不同的软件包和库。它主要用于 Python 环境。
容器的主要目的是将整个应用程序及其依赖项打包成容器,以确保应用程序在不同环境中的一致性和
可移植性
。
隔离级别:
Conda:Conda 提供虚拟环境,通过创建独立的环境来隔离不同软件包的依赖关系,但它仍运行于操作系统之上,依赖于宿主机的操作系统和库(尽管通过环境可以实现一定程度的隔离)。
容器:与宿主机共享内核,在操作系统级别提供隔离,每个容器都有自己的文件系统、网络配置和隔离的进程空间。
8.2 在 Singularity 容器中配置 conda
实例1:构建 qiime1 容器
首先在容器中安装 miniconda
wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh
chmod u+x Miniconda3-latest-Linux-x86_64.sh
./Miniconda3-latest-Linux-x86_64.sh -b -p /opt/miniconda3
chmod --recursive a+rw /opt/miniconda3
必须注意的是,Singularity 容器内的进程默认以用户 root 的身份运行。这意味着 $HOME 被设置为 /root,此时,Miniconda 在默认情况下会被安装到 /root/miniconda3。
然而,root 目录只有 root 账号才能访问,即使里面的文件有 a+rx 权限。即如果我们将 conda 默认装到了容器内 root 目录下,我们将无法以非 root 账户使用容器内的 conda,
因此,conda 一定不能被安装在 /root 目录下
。
针对这一问题,
我们在使用 shell 修改容器时,最好添加
--no-home
参数。
安装 qiime1 及其依赖:
. ~/.bashrc
conda create -n qiime1 python=2.7
conda activate qiime1
apt-get install libfreetype6-dev libxft-dev
pip install matplotlib==1.4.3
pip install biom-format==2.1.4
pip install qiime
print_qiime_config.py -t
实例2:构建 qiime2 容器
下面还展示了一种直接利用 dockerfile 构建 qiime2 容器的方式:
FROM ubuntu:20.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && \
apt-get install -y \
apt-utils \
wget=1.20.3-1ubuntu1 \
git=1:2.25.1-1ubuntu3 && \
apt-get clean && \
rm -rf rm -rf /var/lib/apt/lists/* && \
wget https://repo.anaconda.com/miniconda/Miniconda3-py38_4.8.3-Linux-x86_64.sh && \
chmod +x Miniconda3-py38_4.8.3-Linux-x86_64.sh && \
./Miniconda3-py38_4.8.3-Linux-x86_64.sh -b -p /opt/miniconda3 && \
ln -s /opt/miniconda3/bin/conda /usr/bin/conda && \
wget https://data.qiime2.org/distro/core/qiime2-2020.8-py36-linux-conda.yml && \
conda env create -n qiime2-2020.8 --file qiime2-2020.8-py36-linux-conda.yml && \
conda install -y -n qiime2-2020.8 -c conda-forge -c bioconda -c qiime2 -c defaults q2cli q2templates q2-types q2-feature-table q2-metadata vsearch snakemake && \
chmod --recursive a+rw /opt/miniconda3 && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* && \
rm /qiime2-2020.8-py36-linux-conda.yml && \
rm /Miniconda3-py38_4.8.3-Linux-x86_64.sh
CMD ["/bin/bash"]
参考前面的方法,创建 docker 容器后转为 singularity。或是按上文中的方法直接从 dockerfile 到 singularity。
这样,
singularity exec ~/dockerimage.sif conda
就能正常运行,并显示 conda 的使用情况。然而,如果尝试执行其他一些命令,例如
singularity exec ~/dockerimage.sif conda run python -v
,我们会得到类似以下的错误信息:
OSError: [Errno 30] Read-only file system: '/opt/miniconda3/.tmp58csqy_a'
这是因为除了挂载的目录外,容器是不可变的。此外,运行
singularity exec ~/dockerimage.sif conda activate qiime2-2020.8
也会失败:
CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'. To initialize your shell, run
$ conda init <SHELL_NAME>
Currently supported shells are:
xonsh
powershell
See 'conda init --help' for more information and options.
IMPORTANT: You may need to close and restart your shell after running 'conda init'.
即使我们已经正确修改设置了 shell,我们仍然会得到以上结果。
8.3 使用 Singularity 容器中的 conda
针对以上问题,我们可以提供两种可能的解决方案,然而,这两个都存在很强的限制,目前来看,我们还无法完美的解决这一问题:
方式1:在容器内部运行
首先进入容器:
singularity shell ~/dockerimage.sif
然后在容器内部运行:
conda init
source .bashrc
export LC_ALL=C.UTF-8
export LANG=C.UTF-8
conda activate qiime2-2020.8
这一方法在我们具有 root 权限且只需要在本地运行程序时的体验很好。然而,在我们需要搭配 HPC 使用时非常困难。
方式 2:直接调用特定 conda 环境中的程序执行
例如,我们可以使用 def 文件创建一个包含 conda 的容器后,将参数直接传递给 conda 环境中的程序:
First, you'll want to
# get the environment YML
conda activate your_env
conda env export > environment.yml
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/"$@"
构建容器:
singularity build conda.sif
此时,我们可以直接调用容器内 conda 环境中的 ipython 解释器:
singularity run conda.sif ipython
# 或者使用conda环境中的绝对路径
singularity exec conda.sif /opt/conda/envs/.../bin/app
然而,这种方法无法激活 conda 环境,在某些情况下会遇到环境变量问题。
方式3:手动处理 conda 环境变量
较多情况下,激活 conda 环境的作用在于重新配置环境变量。
例如我们在 base conda 环境下安装某个应用,其软件依赖的可执行程序一般会被放置在 /opt/conda/bin 目录下,在 activate conda 环境后,/opt/conda/bin 目录就会被添加到环境变量中。
因此,在不激活 conda 环境的条件下,我们可以使用三种方式实现环境变量的配置:
(推荐)在调用容器前,添加需要的环境变量:
export PATH="/opt/conda/bin:$PATH"
在现存环境变量的路径下(例如:/usr/local/bin)为调用的软件依赖创建软链接:
ln -s /opt/conda/bin/curl /usr/local/bin/curl
直接修改源代码中的依赖路径为绝对路径。
本文由
mdnice
多平台发布
容器化现有的
conda
环境
我使用
conda
环境来进行数据分析项目。 有时,如果软件包不在bio
conda
或
conda
-forge上,则需要恢复使用pip或R的install.packages进行安装。
这使得很难在另一个系统上重现环境以及分析。 甚至存储为environment.yml文件的纯
conda
环境也可能损坏。
使用以下说明,可以将现有环境打包到Docker或
Singularity
容器中,该容器应具有更高的可移植性,并且还可以轻松地集成到基于的。
Docker,Podman或
Singularity
源
conda
环境必须在linux x64机器上。
conda
-pack -n <MY> -o packed_environment.tar.gz
# With
singularity
singularity
build --fakero
采用容器的方式规避不同框架和需求的包之间的冲突
目前Lico只支持
singularity
2版本制作的镜像
这篇博文是用来引导如何安装使用
singularity
2版本来制作私有镜像
Docker是在操作系统层面进行虚拟化,而传统VM则直接在硬件层面虚拟化
LXC(linux container)
docker基于LXC(linux内核虚拟化技术),和vm、Hypervisor相比效率提高很多。实现了一个容器只包含一个进程的微服务架构
Hypervisor:抽象虚拟化硬件平台
VMWare, XEN抽象虚拟化操作系统
LXC进程级别虚拟化
docker engine和dokcer machine
Docker machine是docker的工具,用来在虚拟加上
%post
echo 'nameserver 8.8.8.8' &amp;amp;amp;amp;gt;&amp;amp;amp;amp;gt; /etc/resolv.conf
apt-get update
apt-get install -y wget ...
sudo mount -uw /
不成功报错:mount_apfs: volume could not be mounted: Operation not permitted
有效的解决方案
在Mac OS10.11之后,Apple公司为了提高系统环境安全,引入了一个内核保护措施–SIP(System Integrity Protection,系统完整性保护),
今天使用容器化软件
singularity
用沙盒方式创建一个了一个ArchLinux的沙盒。
为什么创建ArchLinux的沙盒呢?是因为使用AUR可以直接安装Geant4,非常方便
但是天下没有免费的午餐,也没有免费的晚餐,还没有免费的宵夜。首先安装ArchLinux就非常费劲,其次及时用容器化直接build这个ArchLinux,也非常难搞。
在安装yay(AUR管理程序)的时候,发现...
conda
是一个开源的软件环境管理工具,可以用于安装和管理不同的软件包和依赖项。而
Singularity
是一个开源的容器解决方案,它能够让用户在不同的计算机上以相同的方式运行应用程序。
要在
conda
中安装
Singularity
,需要按照以下步骤进行操作:
步骤一:安装Mini
conda
或Ana
conda
首先,您需要在系统中安装Mini
conda
或Ana
conda
,这是
conda
的主要版本。您可以从官方网站上下载并按照安装指南进行安装。
步骤二:创建环境
打开终端或命令提示符,并运行以下命令来创建一个新的环境:
conda
create -n myenv
这将创建一个名为“myenv”的新环境,您也可以根据需要选择其他名称。
步骤三:激活环境
运行以下命令来激活新创建的环境:
conda
activate myenv
现在,您的终端或命令提示符将显示您正在使用的环境名称。
步骤四:安装
Singularity
运行以下命令来安装
Singularity
:
conda
install -c
conda
-forge
singularity
这将通过
conda
-forge渠道安装最新版本的
Singularity
。
步骤五:验证安装
在安装完成后,您可以运行以下命令来验证
Singularity
是否安装成功:
singularity
--version
这将显示
Singularity
的版本号,证明安装成功。
通过按照以上步骤操作,您可以在
conda
中成功安装
Singularity
。现在,您可以在您的环境中使用
Singularity
以运行容器化的应用程序。