Я создал образ сингулярности (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 при выполнении образа ( тоже не хочу этого делать), он жалуется на то, что не может писать внутри изображения.
Есть ли способ «указать» образу читать и записывать файлы в моем домашнем каталоге, а не внутри изображения?
Спасибо
Я только что столкнулся с той же проблемой, и, похоже, это решило ее для меня: сопоставьте /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, и эта ошибка исчезнет.