如何使用Singularity镜像运行Jupyter笔记本?

5

我已经创建了一个包含最新的Anaconda版本的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 Notebook,它将使用安装在Singularity镜像中的Python版本和软件包。理想情况下,Notebook将读取和写入图像之外的文件(因此我指定了绑定路径)。
然而,当我运行上述命令时,我会得到以下错误:
> 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选项(也不想这样做),它会抱怨无法在镜像内部进行写操作。
有没有一种方法可以“告诉”镜像读写我的主目录中的文件,而不是镜像内部的文件?
谢谢。
3个回答

4

我刚碰到了同样的问题,这似乎为我解决了:将容器内的/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


0

这在使用 singularity 实例时效果很好,例如:

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

0

接受的答案是有效的,但是这里有另外一种不需要绑定挂载的解决方案。在运行jupyter笔记本之前可以运行unset XDG_RUNTIME_DIR,然后这个错误就会消失。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接