python - Docker 容器中的 Jupyter 笔记本不持久?

标签 python docker jupyter-notebook

在 docker 容器中运行 jupyter 对我来说是一个很好的解决方案,但我无法按照文档 here 中的广告内容保持笔记本文件。 .

文档说在 session 关闭并且服务器关闭后,.ipynb(笔记本)文件应该保留在 ./work 目录中,但是,对我来说它们不是。我已经在根目录和出现在 Jupyter 主页中的/work 目录中创建了笔记本,但在关闭后都找不到,如果我重新启动服务器,它们也不再出现在目录列表中。我尝试以两种方式启动容器——首先是按照文档的建议(用最新的图像标签替换):

docker run -p 8888:8888 jupyter/scipy-notebook:latest

其次,通过创建一个 docker-compose.yml 文件,该文件允许我捕获命令文本选项并避免 token 安全性(我不需要),如下所示:
version: '3'

  services: # jupyter notebook
    jupyter_notebook:
    image: jupyter/scipy-notebook
    volumes:
      - ./work:/work
    ports:
      - "8888:8888"
    command: "start.sh jupyter notebook --NotebookApp.token=''"

我在 Ubuntu 18.04.1 LTS 和 docker 18.06.1-ce 下运行
我希望在主机系统的 ./work 文件夹中找到笔记本(至少是我在/work 文件夹中创建的那个),该文件夹位于我启动 docker(或 docker-compose)的目录中,但那里什么也没有。

以下是 session 记录:
   s@VC66:ls -la
   -rw-r--r-- 1 steve steve  232 Nov  7 22:45 docker-compose.yml
   drwxr-xr-x 2 steve steve 4096 Nov  7 21:34 work

   s@VC66:~/sambashare/jupyter$ cat docker-compose.yml 

   version: '3'

     services:
       jupyter_notebook:
         image: jupyter/scipy-notebook
         volumes:
           - ./work:/work
         ports:
           - "8888:8888"
         command: "start.sh jupyter notebook --NotebookApp.token=''"

   s@VC66:~/sambashare/jupyter$ docker-compose up

   Creating network "jupyter_default" with the default driver
   Creating jupyter_jupyter_notebook_1 ... done
   Attaching to jupyter_jupyter_notebook_1
   jupyter_notebook_1  | Container must be run with group "root" to update passwd file
   jupyter_notebook_1  | Executing the command: jupyter notebook --NotebookApp.token=
   jupyter_notebook_1  | [I 16:08:40.454 NotebookApp] Writing notebook server cookie secret to /home/jovyan/.local/share/jupyter/runtime/notebook_cookie_secret
   jupyter_notebook_1  | [W 16:08:40.597 NotebookApp] All authentication is disabled.  Anyone who can connect to this server will be able to run code.
   jupyter_notebook_1  | [I 16:08:40.625 NotebookApp] JupyterLab extension loaded from /opt/conda/lib/python3.6/site-packages/jupyterlab
   jupyter_notebook_1  | [I 16:08:40.625 NotebookApp] JupyterLab application directory is /opt/conda/share/jupyter/lab
   jupyter_notebook_1  | [I 16:08:40.631 NotebookApp] Serving notebooks from local directory: /home/jovyan
   jupyter_notebook_1  | [I 16:08:40.631 NotebookApp] The Jupyter Notebook is running at:
   jupyter_notebook_1  | [I 16:08:40.631 NotebookApp] http://(62b087792f87 or 127.0.0.1):8888/
   jupyter_notebook_1  | [I 16:08:40.631 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
   jupyter_notebook_1  | [I 16:08:58.820 NotebookApp] 302 GET / (172.21.0.1) 0.48ms
   jupyter_notebook_1  | [I 16:09:07.941 NotebookApp] Creating new file in /work
   jupyter_notebook_1  | [I 16:09:17.360 NotebookApp] Saving file at /work/untitled.txt
   jupyter_notebook_1  | [I 16:09:24.725 NotebookApp] Shutting down on /api/shutdown request.
   jupyter_notebook_1  | [I 16:09:24.727 NotebookApp] Shutting down 0 kernels
   jupyter_jupyter_notebook_1 exited with code 0
   s@VC666:~/sambashare/jupyter$ ls work
   s@VC66:~/sambashare/jupyter$ ls
   docker-compose.yml  work

正如您所看到的,它说它在/work 目录中保存了“untitled.txt”,但是在退出时那里什么也没有。

因此,为了进一步细化此处的问题,我更改了 docker-compose.yml 文件以运行一个简单的 python 脚本,以在/work 目录中创建一个文件并查看它是否仍然存在。确实如此!
command: "python3 /work/test.py"  # rather than start.sh...

这是 python test.py 脚本:
   import os
   import pytz
   from datetime import datetime

   dir = "/work"
   if not os.path.isdir(dir):
      dir = "" # to test outside docker container...

   nyc_time = datetime.now( pytz.timezone("America/New_York"))
   fname = os.path.join(dir,"test.txt")
   f = open(fname, 'w')
   f.write(f"Test time is {nyc_time}\n")
   f.close()
   exit()

这一次,在 docker-compose up 之后,工作文件夹包含“test.txt”,其中包含

Test time is 2018-11-09 11:55:28.472581-05:00



所以安装/work 目录的 docker 容器似乎很好——问题可能是 jupyter 图像在关闭时正在做的事情?

最佳答案

我认为您的误解是关于使用 /work 的 docker 容器. AFAIKs 是 /home/jovyan/work反而。

因此,您可以通过例如解决您的麻烦此卷映射

mkdir -P /your-jupyter/work
docker run -p 8888:8888 -e JUPYTER_ENABLE_LAB=yes -v /your-jupyter/work:home/jovyan/work jupyter/scipy-notebook

哈。

关于python - Docker 容器中的 Jupyter 笔记本不持久?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53201430/

相关文章:

Python - 更改列表中的项目值

python - 设置空闲线程/信令线程

docker - localstack docker 给出错误权限被拒绝 : '/tmp/localstack/server.test.pem.key'

Docker-swarm >> 无法连接到 docker 引擎端点

python - 现在开始异步任务,稍后等待

python - 如何将字符串转换为数据框,指定列数?

python - 如何使用具有不同特征维度的数据集训练 sklearn 分类器?

angular - docker 上的 Nginx - 变化 : Accept-Encoding header is missing

python - 在 jupyter notebook 中更新 plotly 图表

kernel - jupyter 的 Octave 内核无法在 Windows 10 上运行