Как запустить блокнот Jupyter, используя образ сингулярности?

Я создал образ сингулярности (jupyter.sif), который содержит последнюю версию anaconda, и я хочу использовать его для запуска ноутбука jupyter.

Я хотел бы запустить что-то вроде этого:

singularity exec \
  --bind /path/outside/image/:/path/inside/image/ \
  jupyter.sif jupyter notebook \
    --notebook-dir=/path/to/dir --no-browser --ip=127.0.0.1

По сути, просто запустите обычный блокнот Jupyter, который будет использовать версию Python и пакеты, установленные в образе сингулярности. В идеале записная книжка будет читать и записывать файлы вне образа (поэтому я указываю путь привязки).

Однако, когда я запускаю указанную выше команду, я получаю следующую ошибку:

> Traceback (most recent call last):   File
> "/opt/conda/lib/python3.7/site-packages/traitlets/traitlets.py", line
> 528, in get
>     value = obj._trait_values[self.name] KeyError: 'runtime_dir'
> 
> During handling of the above exception, another exception occurred:
> 
> Traceback (most recent call last):
> 
>   File "/opt/conda/bin/jupyter-notebook", line 11, in <module>
>     sys.exit(main())
> 
>   File
> "/opt/conda/lib/python3.7/site-packages/jupyter_core/application.py",
> line 266, in launch_instance
>     return super(JupyterApp, cls).launch_instance(argv=argv, **kwargs)
> 
>   File
> "/opt/conda/lib/python3.7/site-packages/traitlets/config/application.py",
> line 657, in launch_instance
>     app.initialize(argv)
> 
>   File "<decorator-gen-7>", line 2, in initialize
> 
>   File
> "/opt/conda/lib/python3.7/site-packages/traitlets/config/application.py",
> line 87, in catch_config_error
>     return method(app, *args, **kwargs)
> 
>   File
> "/opt/conda/lib/python3.7/site-packages/notebook/notebookapp.py", line
> 1626, in initialize
>     self.init_configurables()
> 
>   File
> "/opt/conda/lib/python3.7/site-packages/notebook/notebookapp.py", line
> 1319, in init_configurables
>     connection_dir=self.runtime_dir,
> 
>   File
> "/opt/conda/lib/python3.7/site-packages/traitlets/traitlets.py", line
> 556, in __get__
>     return self.get(obj, cls)
> 
>   File
> "/opt/conda/lib/python3.7/site-packages/traitlets/traitlets.py", line
> 535, in get
>     value = self._validate(obj, dynamic_default())
> 
>   File
> "/opt/conda/lib/python3.7/site-packages/jupyter_core/application.py",
> line 99, in _runtime_dir_default
>     ensure_dir_exists(rd, mode=0o700)
> 
>   File
> "/opt/conda/lib/python3.7/site-packages/jupyter_core/utils/__init__.py",
> line 13, in ensure_dir_exists
>     os.makedirs(path, mode=mode)
> 
>   File "/opt/conda/lib/python3.7/os.py", line 211, in makedirs
>     makedirs(head, exist_ok=exist_ok)
> 
>   File "/opt/conda/lib/python3.7/os.py", line 211, in makedirs
>     makedirs(head, exist_ok=exist_ok)
> 
>   File "/opt/conda/lib/python3.7/os.py", line 221, in makedirs
>     mkdir(name, mode)
> 
> OSError: [Errno 30] Read-only file system: '/run/user'

Я предполагаю, что это связано с тем, что блокнот пытается писать что-то внутри образа, и поскольку я не запускаю образ как sudo (я не хочу этого делать), и я также не указываю --writable при выполнении образа ( тоже не хочу этого делать), он жалуется на то, что не может писать внутри изображения.

Есть ли способ «указать» образу читать и записывать файлы в моем домашнем каталоге, а не внутри изображения?

Спасибо

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
0
2 013
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Я только что столкнулся с той же проблемой, и, похоже, это решило ее для меня: сопоставьте /run/user внутри контейнера с вашим рабочим каталогом снаружи (или каталогом по вашему выбору). Для вашего случая это будет означать, вероятно, следующее:

singularity exec --bind /path/outside/image/:/path/inside/image/ --bind $PWD:/run/user jupyter.sif jupyter notebook --notebook-dir=/path/to/dir --no-browser --ip=127.0.0.1

При таком запуске в моем случае была создана папка 1000

Это хорошо работает с экземплярами сингулярности, например:

   singularity instance.start --writable --contain --bind shared:/shared sandbox/ jupyter

принятый ответ работает, но вот еще одно решение, не требующее монтирования привязки. Можно запустить unset XDG_RUNTIME_DIR перед запуском ноутбука Jupyter, и эта ошибка исчезнет.

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