Необычность; получить репозиторий github в домашний каталог пользователей

Цель

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

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

Проблема

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

Я не могу получить его в домашнем каталоге пользователя, потому что во время %post переменная $HOME, похоже, не указывает на домашний каталог пользователя, она указывает на /root, а созданные объекты принадлежат 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.

Рецепт блюда

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

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

а потом попробуй

$ ls -lh /packages

пример.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
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
819
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

  1. Если вам не нужно что-то В самом деле в хост-системе, не используйте %setup. Он работает от имени пользователя root в операционной системе хоста, и его очень легко сломать так, как вы этого не ожидаете.
  2. По умолчанию сингулярность монтирует $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

Это фантастика спасибо вам! Ваши пункты очень хорошо объяснены. Я бы просто добавил, что для того, чтобы пользователь мог работать с загруженным пакетом (создавать файлы и изменять файлы), по-видимому, требуется umask 000

Clumsy cat 29.05.2019 10:17

Это верно, но только если в ядре хоста включено наложение. Это, вероятно, относится к большинству людей, работающих на своих персональных компьютерах, но оверлей имеет некоторые проблемы со стабильностью и часто отключается на больших серверах (например, в средах HPC). Полезно всегда рассматривать контейнер как доступный только для чтения и монтировать в любые каталоги, где вы можете писать сколько душе угодно. Это может быть бесполезно для того, что вы делаете, и если вы знаете, что это будет работать только с ядрами с поддержкой оверлея, это, вероятно, нормально.

tsnowlan 29.05.2019 15:41

Другие вопросы по теме