Как запустить ноутбук Jupyter, используя изображение сингулярности?
Я создал образ Singularity (jupyter.sif), который содержит последнюю версию анаконды, и я хочу использовать его для запуска ноутбука 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 (последний вызов был последним): файл "/opt/conda/lib/python3.7/site-packages/traitlets/traitlets.py", строка 528, в get value = obj._trait_values [self.name] KeyError: 'runtime_dir"
Во время обработки вышеупомянутого исключения произошло другое исключение:
Traceback (последний вызов был последним):
Файл "/opt/conda/bin/jupyter-notebook", строка 11, в sys.exit(main())
Файл "/opt/conda/lib/python3.7/site-packages/jupyter_core/application.py", строка 266, в файле launch_instance, возвращает super(JupyterApp, cls).launch_instance(argv=argv, **kwargs)
Файл "/opt/conda/lib/python3.7/site-packages/traitlets/config/application.py", строка 657, в файле launch_instance app.initialize(argv)
Файл "", строка 2, в инициализации
Файл "/opt/conda/lib/python3.7/site-packages/traitlets/config/application.py", строка 87, в методе возврата catch_config_error (app, *args, **kwargs)
Файл "/opt/conda/lib/python3.7/site-packages/notebook/notebookapp.py", строка 1626, в initialize self.init_configurables()
Файл "/opt/conda/lib/python3.7/site-packages/notebook/notebookapp.py", строка 1319, в init_configurables connection_dir=self.runtime_dir,
Файл "/opt/conda/lib/python3.7/site-packages/traitlets/traitlets.py", строка 556, в get return self.get (obj, cls)
Файл "/opt/conda/lib/python3.7/site-packages/traitlets/traitlets.py", строка 535, в get value = self._validate(obj, dynamic_default())
Файл "/opt/conda/lib/python3.7/site-packages/jupyter_core/application.py", строка 99, в _runtime_dir_default sure_dir_exists(rd, mode=0o700)
Файл "/opt/conda/lib/python3.7/site-packages/jupyter_core/utils/init.py", строка 13, в sure_dir_exists os.makedirs(путь, режим = режим)
Файл "/opt/conda/lib/python3.7/os.py", строка 211, в македирах македир (head, exist_ok=exist_ok)
Файл "/opt/conda/lib/python3.7/os.py", строка 211, в македирах македир (head, exist_ok=exist_ok)
Файл "/opt/conda/lib/python3.7/os.py", строка 221, в makedirs mkdir(имя, режим)
OSError: [Errno 30] Файловая система только для чтения: '/ run / user'
#####
Я предполагаю, что это потому, что ноутбук пытается что-то написать внутри изображения, и так как я не запускаю изображение как sudo (я не хочу этого делать), и я также не указываю --writable при выполнении изображения (также не хочу этого делать), он жалуется на то, что не может писать внутри изображения.
Есть ли способ "сказать" изображению о том, что он читает и записывает файлы в моем домашнем каталоге, а не внутри изображения?
Спасибо
3 ответа
Я только что столкнулся с той же проблемой, и это, похоже, решило ее для меня: map /run/user inside для контейнера в ваш рабочий каталог снаружи (или каталог по вашему выбору). Для вашего случая, это будет означать, вероятно, это:
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, и эта ошибка исчезнет.