我们可以使用 --user / -u 在 docker 容器中运行 jupyter lab

RFe*_*Fen 5 python jupyter jupyter-lab

我正在尝试将 jupyter-lab 添加到我现有的 docker 映像之一(带有 R、python 和特定于工作的库)以进行交互式测试。

一个有效的示例是这个 Dockefile:

FROM my_existing_image

# Install jupyter lab (assuming python3 and pip3 already installed)
RUN pip3 install jupyterlab

# Declare port used by jupyter-lab
EXPOSE 8888

# Set default command
CMD ["jupyter", "lab", "--port=8888", "--no-browser", "--ip=0.0.0.0", "--allow-root"]
Run Code Online (Sandbox Code Playgroud)

但是,我们有一个共享 NFS 驱动器,我们将其安装在/mnt/NAS. 要以正确的权限从 docker 容器访问共享文件夹,我们通常使用以下标志启动它们:

docker run -u $(id -u ${USER}):$(id -g ${USER}) -v /mnt:/mnt my_image
Run Code Online (Sandbox Code Playgroud)

但是,-u( --user) 选项会阻止 juyter-lab 正常启动,并且我收到以下错误消息:

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/dist-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 "/usr/local/bin/jupyter-lab", line 10, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.7/dist-packages/jupyter_core/application.py", line 270, in launch_instance
    return super(JupyterApp, cls).launch_instance(argv=argv, **kwargs)
  File "/usr/local/lib/python3.7/dist-packages/traitlets/config/application.py", line 663, in launch_instance
    app.initialize(argv)
  File "<decorator-gen-7>", line 2, in initialize
  File "/usr/local/lib/python3.7/dist-packages/traitlets/config/application.py", line 87, in catch_config_error
    return method(app, *args, **kwargs)
  File "/usr/local/lib/python3.7/dist-packages/notebook/notebookapp.py", line 1766, in initialize
    self.init_configurables()
  File "/usr/local/lib/python3.7/dist-packages/notebook/notebookapp.py", line 1380, in init_configurables
    connection_dir=self.runtime_dir,
  File "/usr/local/lib/python3.7/dist-packages/traitlets/traitlets.py", line 556, in __get__
    return self.get(obj, cls)
  File "/usr/local/lib/python3.7/dist-packages/traitlets/traitlets.py", line 535, in get
    value = self._validate(obj, dynamic_default())
  File "/usr/local/lib/python3.7/dist-packages/jupyter_core/application.py", line 100, in _runtime_dir_default
    ensure_dir_exists(rd, mode=0o700)
  File "/usr/local/lib/python3.7/dist-packages/jupyter_core/utils/__init__.py", line 13, in ensure_dir_exists
    os.makedirs(path, mode=mode)
  File "/usr/lib/python3.7/os.py", line 211, in makedirs
    makedirs(head, exist_ok=exist_ok)
  File "/usr/lib/python3.7/os.py", line 211, in makedirs
    makedirs(head, exist_ok=exist_ok)
  File "/usr/lib/python3.7/os.py", line 211, in makedirs
    makedirs(head, exist_ok=exist_ok)
  File "/usr/lib/python3.7/os.py", line 221, in makedirs
    mkdir(name, mode)
PermissionError: [Errno 13] Permission denied: '/.local'
Run Code Online (Sandbox Code Playgroud)

我无法找到配置 Dockerfile 来访问驱动器和 jupyter-lab 工作的正确方法。我们经常以同样的方式使用Rocker/Rstudio容器,没有任何问题。

您有什么建议吗?感谢您的帮助。

kmi*_*iya 0

我收到了相同的错误消息,因为容器的 $HOME 变量是 root /,如果没有sudo.

所以,对我来说,解决方案是将 $HOME 设置为指向可写目录。例如,

mkdir ./.home  # make a virtual home directory
docker run \
    -u $(id -u):$(id -g) -v $(pwd):$(pwd) -w $(pwd) -e HOME=$(pwd)/.home \
    -it --rm --init -p 8888:8888 your_image \
    jupyter lab --ip=0.0.0.0 --port=8888 --no-browser
Run Code Online (Sandbox Code Playgroud)