Установка и настройка Jupyter Notebook в Docker (Windows 7)

Описание процесса установки и запуска Jupyter Notebook, а так же сохранение блокнота в git.

Установка в Windows 7

Если использовать jupyter/base-notebook в качестве базового контейнера, это приведет к возникновению ошибке:

  File "/opt/conda/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/candidates.py", line 304, in _prepare_distribution
    return preparer.prepare_linked_requirement(self._ireq, parallel_builds=True)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/conda/lib/python3.11/site-packages/pip/_internal/operations/prepare.py", line 532, in prepare_linked_requirement
    metadata_dist = self._fetch_metadata_only(req)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/conda/lib/python3.11/site-packages/pip/_internal/operations/prepare.py", line 383, in _fetch_metadata_only
    return self._fetch_metadata_using_link_data_attr(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/conda/lib/python3.11/site-packages/pip/_internal/operations/prepare.py", line 403, in _fetch_metadata_using_link_data_attr
    metadata_file = get_http_url(
                    ^^^^^^^^^^^^^
  File "/opt/conda/lib/python3.11/site-packages/pip/_internal/operations/prepare.py", line 107, in get_http_url
    from_path, content_type = download(link, temp_dir.path)
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/conda/lib/python3.11/site-packages/pip/_internal/network/download.py", line 147, in __call__
    for chunk in chunks:
  File "/opt/conda/lib/python3.11/site-packages/pip/_internal/cli/progress_bars.py", line 52, in _rich_progress_bar
    with progress:
  File "/opt/conda/lib/python3.11/site-packages/pip/_vendor/rich/progress.py", line 1169, in __enter__
    self.start()
  File "/opt/conda/lib/python3.11/site-packages/pip/_vendor/rich/progress.py", line 1160, in start
    self.live.start(refresh=True)
  File "/opt/conda/lib/python3.11/site-packages/pip/_vendor/rich/live.py", line 132, in start
    self._refresh_thread.start()
  File "/opt/conda/lib/python3.11/threading.py", line 957, in start
    _start_new_thread(self._bootstrap, ())
RuntimeError: can't start new thread

Проблема заключается в использовании устаревшей версии docker (проверить версию можно набрав: docker version). Для решения проблемы нужно:

  • установить более свежую версию docker (может не работать на устаревающих ОС)
  • найти контейнер, который будет правильно работать в текущей версии docker (далее будет использоваться версия jupyter/base-notebook:12ba1d59fbc3)
  1. Создать Docker файл, и добавить в него:
FROM jupyter/base-notebook:12ba1d59fbc3

RUN pip install pandas numpy xlsxwriter xlrd openpyxl matplotlib requests jupytext

Дополнительно будут установлены необходимые библиотеки для анализа, преобразования, отображения данных, а также библиотеки для запроса данных с сторонних ресурсов.

  1. Создать docker-compose со следующим содержимым:
version: "3"

services:
  python-server:
    build: ./python
    ports:
      - "8888:8888"
    volumes:
      - /PATH_TO_YOU_CODE_FOLDER_FROM_SHARE_DIR://home/jovyan/work
  1. Выполнить:
docker-compose build
docker-compose up -d
docker ps

В результате будет собран и запущен контейнер, а последняя команда отобразит все запущенные в системе контейнеры с их идентификаторами

  1. Определить идентификатор контейнера python-server и просмотреть логи сервера, выполнив:
docker logs YOU_CONTAINER_ID

Найти в выводе строку похожую на:

http://localhost:8888/?token=112bb073331f1460b73768c76dffb2f87ac1d4ca7870d46a
  1. Скопировать параметры строки (то что идет после 8888/)
  2. Определить адрес, по которому доступен контейнер:
docker-machine ip
  1. Набрать в браузере:
IP:8888

В результате откроется страниц вида:

  1. Дополнить строку в браузере параметрами, скопированными на шаге 5, чтобы получилась строка вида:
IP:8888/?token=112bb073331f1460b73768c76dffb2f87ac1d4ca7870d46a

В результате будет осуществлен вход в Jupyter Notebook и можно будет создавать свои блокноты:

Сохранение проекта в git

Jupyter notebooks сохраняет файлы .ipynb в JSON формате, в результате чего все графические изображения будут преобразованы в строки, это затруднит просмотр реальных изменений. Для обхода этого ограничения «блокнот» будет сохранен в двух форматах .ipynb и .Rmd (r-markdown формат — текстовый файл, без результатов вывода)

  1. Отредактировать Docker файл, добавив в него установку jupytext (если нету):
RUN pip install jupytext
  1. Добавить volume в docker-compose, ссылающийся на //home/jovyan/.jupyter:
- /PATH_TO_YOU_CONFIG_FOLDER_FROM_SHARE_DIR://home/jovyan/.jupyter
  1. Войти в Docker контейнер:
docker exec -i -t YOU_CONTAINER_ID bash
  1. Выполнить:
jupyter notebook --generate-config

Будет создан файл конфигурации .jupyter/jupyter_notebook_config.py (если он еще не существует, иначе возникнет предложение переписать его)

  1. Отредактировать файл конфигурации, добавив в него:
c.ContentsManager.default_jupytext_formats = ".ipynb,.Rmd"

Дополнительно может потребоваться прописать в конфигурацию:

c.NotebookApp.contents_manager_class="jupytext.TextFileContentsManager"
  1. Перезапустить контейнер
  2. Теперь можно добавлять в git .Rmd файлы, а файлы .ipynb добавить в список игнорирования