Согласно оболочка документа:
The change in prompt indicates that you have entered the container (though you should not rely on that to determine whether you are in container or not).
Итак, кроме изменения приглашения, как должен определить, находятся ли они в контейнере или нет?
Один из способов сделать это — передать аргумент --cleanenv в команде оболочки сингулярности и проверить, совпадает ли переменная PATH с PATH вашего хост-пользователя:
#add an arbitrary file location to your PATH variable and check that it is present for the host
export PATH=$PATH:/path/to/foo/bar
echo $PATH
#now pull up a shell in your container with --cleanenv to ignore the environmental variables of the host - such as the PATH we just exported
singularity shell --cleanenv yourimage.sif
#check that /path/to/foo/bar is not in PATH in your container
echo $PATH
Есть несколько переменных среды, которые вы можете проверить:
SINGULARITY_BIND
- может быть пустым, если не установлены бинды/маунтыSINGULARITY_COMMAND
- например.,exec
, shell
и т. д.SINGULARITY_CONTAINER
- путь к образу на хост-ОСSINGULARITY_ENVIRONMENT
- обычно /.singularity.d/env/91-environment.sh
или что-то подобноеSINGULARITY_NAME
- имя файла изображения сингулярностиВ качестве альтернативы, проверка существования /.singularity.d/Singularity
. Если внутри контейнера сингулярности, это копия определения сингулярности, используемого при создании образа. В общем, маловероятно, что /.singularity.d
будет существовать на обычной хост-ОС, если только кто-то не сделал что-то действительно странное.
Значение SINGULARITY_COMMAND
не является фактическим двоичным файлом или чем-то подобным, это конкретное ключевое слово, которое использовалось при запуске сингулярности: singularity exec ...
, singularity shell ...
и т. д. Никаких сценариев, о которых я знаю, но проверка на /.singularity.d
, вероятно, самая простая. надежен, так как для изменения требуются привилегии root /
.
Там много возможностей, но в примере контейнера, который я только что ввел, не было установленных привязок/монтирований, поэтому
SINGULARITY_BIND
существовал, но был пуст, как вы упомянули.SINGULARITY_COMMAND
не существовало, и я не совсем уверен, что есть хороший способ проверить, существует лиexec
илиshell
, когдаwhereis exec
возвращаетexec:
. Я полагаю, что любой из этих env vars потенциально может быть создан в хост-системе по неизвестным причинам (хотя маловероятно, что все они будут существовать). Известны ли вам какие-либо поддерживаемые тесты/скрипты, которые будут проходить некоторые логические проверки, используя все/некоторые из них?