Создание рецепта сингулярности из образа докера Nipype CommandNotFound - PullRequest
0 голосов
/ 09 мая 2018

У меня есть следующий рецепт контейнера Singularity:

#!/bin/bash

Bootstrap: docker
From: nipype/nipype:latest

%labels
  Version v1.0

%post
  # Install nano
  apt-get update
  apt-get install nano

  # Set up Python environment
  CONDA_ENV=/opt/conda/bin
  export PATH=$CONDA_ENV:$PATH
  chmod -R 777 $CONDA_ENV

  # Activate conda environment
  conda activate neuro
  conda install seaborn
  pip install pybids

и я создаю контейнер с Singularity следующим образом:

sudo singularity build swish.simg Singularity.swish

Установка зависимостей и большинства сборок идет нормально, пока я не укажу на ошибку source not found. Чтобы повторить проблему и то, что я пробовал:

  • Я строю изображение Nipype из рецепта. В% post я хотел бы установить два дополнительных пакета (seaborn и pybids) в среду "neuro" conda.
  • Однако, когда я пытаюсь активировать нейро-среду в% post («source activ neuro»), я получаю сообщение об ошибке, в котором говорится, что команда «source» не найдена.
  • Я бы хотел запустить команды в% post с помощью bash, но не уверен, где их указать.

1 Ответ

0 голосов
/ 09 мая 2018

Проблема сводится к тому, как вы активируете среду. Обычно вы делаете:

source /opt/conda/bin/activate neuro

но в случае, когда пост контейнера Singularity создается в оболочке (sh), ожидается, что вы не найдете команду source. Вместо этого вы хотите сделать:

. /opt/conda/bin/activate neuro

и тогда вам не нужно суетиться с $PATH. Вам также не нужно указывать переводчика в верхней части файла. Так что весь рецепт должен выглядеть так:

Bootstrap: docker
From: nipype/nipype:latest

# This is the adjusted (fixed) build recipe for the issue above.
# sudo singularity build swist Singularity.swist

%labels
    Version v1.0

%environment
    . /opt/conda/bin/activate neuro

%post
    # Install nano
    apt-get update && apt-get install -y nano

    # Install into conda environment
    . /opt/conda/bin/activate neuro &&
    /opt/conda/bin/conda install --name neuro -y seaborn &&
    /opt/conda/envs/neuro/bin/pip install pybids

И тогда использование будет:

sudo singularity build swist Singularity.swist

singularity/swist_fmri_image>   . /opt/conda/bin/activate neuro

(neuro) Singularity swist:~/swist-> python
Python 3.6.5 | packaged by conda-forge | (default, Apr  6 2018, 13:39:56) 
[GCC 4.8.2 20140120 (Red Hat 4.8.2-15)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import seaborn
>>> import bids
>>>

Я поместил всю запись об этом в gist

Полезные советы по отладке

Вот несколько полезных советов по отладке! Способ, которым я понял выше, заключался в том, чтобы сделать сборку, закомментировав последние строки с помощью conda, которая вызвала ошибку. Тогда я мог бы построить песочницу с возможностью записи:

sudo singularity build --sandbox swist-box Singularity.swist

и оболочка с возможностью записи. Это позволит мне внести изменения и проверить.

sudo singularity shell --writable swist-box
$ whoami
root

Так как контейнер мог бы быть доступен для записи, это означает, что изменения будут сохраняться, поэтому вы можете выйти из режима root и затем редактировать в пространстве пользователя, чтобы проверить, действительно ли ваши корневые изменения устранили проблему!

singularity shell swist-box
$ whoami
neuro

Тогда, когда вы думаете, что все хорошо, удалите изображение и соберите его с нуля и протестируйте.

rm -rf swist-box swist
sudo singularity build swist Singularity.swist
...