Я столкнулся с несколькими случаями, когда было бы очень полезно контейнеризировать среду conda для долгосрочной воспроизводимости. Поскольку я обычно использую высокопроизводительные вычислительные системы, они должны быть контейнерами Singularity по соображениям безопасности. Как это может быть сделано?
Во-первых, вам нужно получить среду YML для вашей конкретной среды conda.
conda activate your_env
conda env export > environment.yml
Вот пример рецепта Singularity (в файле с именем «Singularity» в том же каталоге, что и «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/"$@"
Постройте это с
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.
@АндреаТ. Проблема в том, что команда echo "source enable $(...)" > ~/.bashrc не выполняется должным образом. Вы можете жестко закодировать результат команды head/cut и повторить попытку.
@compBio Спасибо, это работает прилично, если у меня есть root-доступ. Любая идея, есть ли обходной путь, если я только локальный пользователь?
@ATpoint Singularity имеет функцию «fakeroot», которая может решить вашу проблему. Хотя, я не настолько знаком с этим. Бывший. 'singularity build --fakeroot /tmp/test.sif /tmp/test.def'
Я нашел это полезным, потому что вы можете установить контейнер с установленной средой 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
Следовательно, после того, как ваш env создан, вы можете активировать его с помощью следующих команд (опять же, сначала вам нужно перейти в свой контейнер):
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.
Пробовал и после "прогона" получаю вот такую ошибку:
singularity run conda.simg conda -h
head: cannot open 'env.yaml' for reading: No such file or directory