Цель
Цель состоит в том, чтобы создать контейнер с особенностями, который устанавливает некоторые пакеты, затем клонирует пользовательский пакет из репозитория 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