Singularity;получить репозиторий github в домашний каталог пользователей - PullRequest
0 голосов
/ 22 мая 2019

Цель

Цель состоит в том, чтобы создать контейнер с особенностями, который устанавливает некоторые пакеты, затем клонирует пользовательский пакет из репозитория git и создает его.У пользователя должно быть разрешение на выполнение действий с пользовательским пакетом, и в идеале он должен находиться в домашнем каталоге пользователя Singularity, но это кажется более сложным, чем я ожидал.

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

Проблема

Клонирование git-репозитория кажется нормальным, но я могу сказать, что единственное место, где пользователь может видеть, это /github_repo, и он всегда принадлежит root.

Я не могу получить его в домашний каталог пользователя, потому что во время %post переменная $HOME, кажется, не указывает на домашний каталог пользователя, она указывает на /root, и создаваемый объект затем принадлежиткорень.Фактически, хотя /home существует, он пуст, кажется, что пользователь еще не существует.

Я попытался клонировать в /github_repo, затем добавив

chown -R $USER /github_repo
chmod -R 766 /github_repo

в %post.Контейнер может быть собран и запущен, и когда он работает;

$ ls -lh /github_repo
ls: cannot access '/github_repo': Permission denied
total 0
d????????? ? ? ? ?           ? CorrectNameOfGithubFolder
-????????? ? ? ? ?           ? CorrectNameOfGithubFile

Так он может видеть имена файлов и папок, но не их разрешения?Я даже не знал, что это возможно.Если я не буду возиться с разрешениями в %post, это совершенно нормальный файл, принадлежащий root.

Recipe

Это то, что у меня есть, вы должны найти егопробеги.Если вы хотите запустить его, сохраните получатель как example.def, затем выполните

sudo singularity build example.sif example.def
singularity run --containall example.sif

и попробуйте

$ ls -lh /packages

example.def


BootStrap: docker
From: ubuntu:18.04

# commands on the host system
%setup
    # make print colour #
    GREEN='\033[0;32m'
    NOCOLOUR='\033[0m'
    echo "${GREEN}~~~ Getting modified packages from github ~~~ ${NOCOLOUR}"
    export PACKAGES_TMP=/tmp/packages
    rm -fr $PACKAGES_TMP
    mkdir -p $PACKAGES_TMP
    git clone https://github.com/rootpy/rootpy-tutorials.git $PACKAGES_TMP
    cp -R ${PACKAGES_TMP} ${SINGULARITY_ROOTFS}

# get files from the host (but we dont need any)
%files

# what is done when the container is built
%post
    # make print colour #
    GREEN='\033[0;32m'
    NOCOLOUR='\033[0m'
    # start
    echo "${GREEN}~~~ install apt packages ~~~ ${NOCOLOUR}"
    apt -y update
    # for fetching from repos if needed
    apt -y install git
    # for getting anything else from the net
    apt -y install wget
    # text editors
    apt -y install vim-tiny
    apt -y install nano
    # for making downloaded packages
    apt -y install make

    echo "${GREEN}~~~ Set up a .bashrc ~~~ ${NOCOLOUR}"
    BASHRC=/home/.bashrc
    touch $BASHRC
    echo "alias vim=vim.tiny\n" >> $BASHRC
    # will be called in run

    ## Not working???
    ## the /home/ directory appears empty
    # echo "${GREEN}~~~ Move packages to home dir ~~~ ${NOCOLOUR}"
    MY_HOME=$(ls -l /home/)
    echo in post home is $MY_HOME
    touch ~/test
    touch $HOME/test
    mkdir $HOME/test_dir
    # PACKAGES=$MY_HOME/packages/
    # mv /packages $PACKAGES

    echo "${GREEN}~~~ Give the user permission and control ~~~ ${NOCOLOUR}"
    # this bit does odd things
    PACKAGES=/packages
    chown -R $USER $PACKAGES
    chmod -R 766 $PACKAGES

    echo "${GREEN}~~~ Making the packages ~~~ ${NOCOLOUR}"
    # need to implement


# enviroment variabels instide the container
# sourced at run time not build time
%environment
    export PACKAGES=/packages/
    export BASHRC=/home/.bashrc


# this is executed when the contain is launched with
# singularity run example.sif
%runscript
    MY_HOME=$(ls -l /home/)
    echo at run home is $MY_HOME
    touch ~/runtest1
    touch $HOME/runtest2
    mkdir $HOME/runtest_dir
    ls -lh /
    ls -lh $HOME
    ls -lh $HOME/runtest_dir/
    # source the .bashrc
    echo $BASHRC
    /bin/bash --rcfile $BASHRC


# this would be executed just after build
%test
    echo I havent written any tests

# metadata
%labels
    Author ClumsyCat
    Version v1.0

%help
    to build me
    > sudo singularity build example.sif example.def
    to run me do
    > singularity run --containall --bind /my/out/dir/ example.sif
        the "--containall" flag prevents interactions with your system
        the "--bind /my/out/dir/" mounts a directory in your system
        this allows scripts in that directory to be accessed from the image
        and results from the image to persist in the directory
        It also allows the run script to call .bashrc

1 Ответ

1 голос
/ 28 мая 2019

Здесь происходит несколько вещей.

  1. Если в хост-системе нет ничего, что вам действительно нужно, не используйте %setup. Он работает от имени пользователя root на операционной системе хоста, и его действительно легко сломать так, как вы этого не ожидаете.
  2. По умолчанию функция singularity монтирует $HOME работающего пользователя в контейнер, поэтому все, что вы введете в /home/..., будет перезаписано, если пользователь не использует --no-home. Рекомендации по этой причине не рекомендуется устанавливать в $ HOME
  3. Все шаги в %post, когда вы ссылаетесь на $ USER, устанавливают его как root, потому что это пользователь, когда он запускается (sudo singularity build ...), поэтому он на самом деле делает что-нибудь
  4. chmod -R 664 - это ломает ваши каталоги. Вам нужен бит выполнения для фактического доступа к каталогу, а не только для чтения

Я настроил ваш файл определения примера, чтобы он работал больше, чем вы собираетесь. Комментарии объясняют почему.

BootStrap: docker
From: ubuntu:18.04

%post
    # make print colour #
    GREEN='\033[0;32m'
    NOCOLOUR='\033[0m'
    PACKAGES=/packages

    # give all files 774 and directories 775 by default
    umask 002

    # start
    echo "${GREEN}~~~ install apt packages ~~~ ${NOCOLOUR}"
    # install everything at once and use apt-get for non-interactive installs
    apt-get -y update && apt-get install -y git wget vim-tiny nano make

    # create a symlink to vim instead of an alias
    ln -s $(which vim.tiny) /usr/local/bin/vim

    echo "${GREEN}~~~ Getting modified packages from github ~~~ ${NOCOLOUR}"
    # git clone in %post instead of %setup
    mkdir $PACKAGES
    cd $PACKAGES
    git clone https://github.com/rootpy/rootpy-tutorials.git

    echo "${GREEN}~~~ Making the packages ~~~ ${NOCOLOUR}"
    # need to implement
    echo do something here

%environment
    export PACKAGES=/packages

%runscript
    echo I am $(whoami)
    echo

    cd $PACKAGES
    echo I am in $PWD
    ls -la --color=auto
    echo

    echo vim is: $(which vim)

Бег singularity run --containall example.sif дает:

I am tsnowlan

I am in /packages
total 0
drwxrwxr-x 3 root     root      39 May 28 12:23 .
drwxr-xr-x 1 tsnowlan tsnowlan  60 May 28 12:24 ..
drwxrwxr-x 6 root     root     117 May 28 12:23 rootpy-tutorials

vim is: /usr/local/bin/vim
...