Запуск jupyter в док-контейнере - это хорошее решение для меня, но у меня возникают проблемы с сохранением файлов ноутбука, как указано в документации здесь .
В документах говорится, что после закрытия сеанса и выключения сервера файлы .ipynb (записной книжки) должны быть сохранены в каталоге ./work, однако для меня это не так. Я создал записные книжки как в корневом каталоге, так и в каталоге / work, который отображается на домашней странице Jupyter, но ни один из них не будет найден после выключения, и если я перезапущу сервер, их больше нет в списке каталогов. Я попытался запустить контейнер двумя способами - во-первых, как это было предложено в документации (вместо тега изображения была указана последняя):
docker run -p 8888:8888 jupyter/scipy-notebook:latest
и во-вторых, создав файл docker-compose.yml, который позволяет мне записывать параметры текста команды и избегать безопасности токена (которая мне не нужна) следующим образом:
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 с докером 18.06.1-ce
Я ожидаю найти записную книжку (по крайней мере ту, которую я создал в папке / work) в папке ./work хост-системы, которая находится в каталоге, где я запустил docker (или docker-compose), но там ничего нет.
Вот стенограмма сессии:
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
Как вы можете видеть, он говорит, что сохранил "untitled.txt" в / work dir, но после выхода там ничего нет.
Поэтому, чтобы еще больше уточнить проблему, я изменил файл 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, рабочая папка содержит "test.txt", который содержит
Время тестирования 2018-11-09 11: 55: 28.472581-05: 00
Таким образом, док-контейнер, монтирующий каталог / work, выглядит нормально - возможно, проблема в том, что образ jupyter делает при завершении работы?