【问题标题】:Creating a docker container for Jupyter为 Jupyter 创建一个 docker 容器
【发布时间】:2026-02-08 11:10:01
【问题描述】:

我想给我的学生一个 docker 容器,以便他们能够进行实验。我以为我使用以下 dockerfile:

FROM jupyter/datascience-notebook:latest

ADD ./config.json /home/jovyan/.jupyter/jupyter_notebook_config.json
ADD ./books /home/jovyan/work

因此,标准容器将包含一些我创建并存储在 books 文件夹中的笔记本。然后我在本地构建并运行这个容器

#!/usr/bin/env bash
docker build -t aaa .
docker run --rm -p "8888:8888" -v $(pwd)/books:/home/joyvan/work aaa

我构建容器 aaa 并再次与它共享文件夹书籍(尽管书籍已在编译时复制到图像中)。我现在在端口 8888 上打开容器。我可以编辑 /home/joyvan/work 文件夹中的文件,但这些东西不会被传输回主机。发生了可怕的错误。是不是因为我在 docker build 期间添加了文件,然后在 -v ...中再次共享它们?

我玩过各种选择。我已将本地用户添加到用户组。我确实对书中的所有文件进行了 chown。我的所有文件在容器中都显示为 root:root。然后我是容器中的joyvan,并且没有对这些文件的写访问权。我如何确保文件归joyvan所有?

编辑:

其他一些元素:

tom@thomas-ThinkPad-T450s:~/babynames$ docker exec -it cranky_poincare /bin/bash
jovyan@5607ac2bcaae:~$ id
jovyan uid=1000(jovyan) gid=100(users) groups=100(users)
jovyan@5607ac2bcaae:~$ cd work/
jovyan@5607ac2bcaae:~/work$ ls
test.txt text2.txt
jovyan@5607ac2bcaae:~/work$ ls -ltr
total 4
-rw-rw-r-- 1 root root 5 Dec 12 19:05 test.txt
-rw-rw-r-- 1 root root 0 Dec 12 19:22 text2.txt

在主机上:

tom@thomas-ThinkPad-T450s:~/babynames/books$ ls -ltr
total 4
-rw-rw-r-- 1 tom users 5 Dez 12 20:05 test.txt
-rw-rw-r-- 1 tom users 0 Dez 12 20:22 text2.txt
tom@thomas-ThinkPad-T450s:~/babynames/books$ id tom
uid=1001(tom) gid=1001(tom) groups=1001(tom),27(sudo),100(users),129(docker)

【问题讨论】:

  • 手动检查 shell 会话时是否存在相关文件?您在构建时是否有任何回溯/日志?
  • 什么用户在你的容器中运行你的服务?他的 UID/GID 是什么?另外,您是否有任何错误消息/回溯,并且在您编辑时更改是否出现在您的容器中?
  • 你也可以运行ls -l books吗?
  • 我已将您的输出添加到您的帖子中,您可以删除您的评论。但是您能否从主机的角度为~/work 本身和您的挂载点添加输出?

标签: docker jupyter


【解决方案1】:

你可以试试:

FROM jupyter/datascience-notebook:latest

ADD ./config.json /home/jovyan/.jupyter/jupyter_notebook_config.json
ADD ./books /home/jovyan/work
RUN chown joyvan /books

如果该用户已经存在,但使用 RUN,您可以执行 docker 文件中的所有命令。

【讨论】: