jupyterhub в контейнере докеров не может подключиться к внешнему каталогу

Я настраиваю jupyterhub для пользователей в нашей группе, чтобы они могли запускать сценарии с использованием нашего пакета python для общих данных без необходимости устанавливать среду на свои компьютеры. Система основана на jupyterhub-deploy-docker (https://github.com/jupyterhub/jupyterhub-deploy-docker/) с изменениями для работы на локальном хосте (https://github.com/PHI-Toolkit/jupyterhub-deploy-docker-localhost), который порождает контейнеры Docker с однопользовательскими экземплярами записных книжек jupyter из докеризованного jupyterhub. Идея состоит в том, чтобы смонтировать локальный каталог хоста (или каталог сервера данных) в контейнер jupyterhub и оттуда передать его одиночным пользовательским экземплярам, ​​которые будут использоваться как notebook_dir. Затем ipynbs может получить доступ к данным на сервере и сохраниться там.

Весь подход работает хорошо, когда он не докеризирован (для тестирования, аутентификации с помощью DummyAuthenticator и создания с помощью SimpleLocalProcessSpawner), но я не могу заставить контейнеры докеров видеть каталог хоста. Мой подход состоит в том, чтобы дополнительно связать путь на хост-машине и указать используемый DOCKER_NOTEBOOK_DIR в качестве цели. Поэтому в docker-compose.yml переделываю раздел томов

volumes:
  # Bind Docker socket on the host so we can connect to the daemon from
  # within the container
  - "/var/run/docker.sock:/var/run/docker.sock:rw"
  # Bind Docker volume on host for JupyterHub database and cookie secrets
  - "data:${DATA_VOLUME_CONTAINER}"
  - "/path/on/host:${DOCKER_NOTEBOOK_DIR}"

это используется в jupyterhub_config.py как notebook_dir создателя:

notebook_dir = os.environ.get('DOCKER_NOTEBOOK_DIR') or '/home/jovyan/work'
c.DockerSpawner.notebook_dir = notebook_dir
# c.DockerSpawner.volumes = {
#     'jupyterhub-user-{username}': notebook_dir,
#     'jupyter-shared': '/home/jovyan/work/shared/',
#     'jupyter-geoserver': '/home/jovyan/work/geoserver',
#     'jupyter-modules': '/home/jovyan/work/modules'
#}
c.DockerSpawner.volumes = { 'jupyter-serverdata': notebook_dir,
    'jupyter-shared': '/home/jovyan/work/shared/',
}

Я бы подумал, что тогда блокнот ipython должен получить доступ к содержимому / path / on / host, но я все равно получаю те же каталоги, что и в стандартной конфигурации (с тем же содержимым, хотя я удалил контейнеры и изображения jupyterhub). Как я подозреваю, это связано с DockerSpawner, я попытался использовать SimpleLocalProcessSpawner, но все еще запускал jupyterhub в его контейнере докеров. Однако мне не удалось запустить это (порождение приводит к ошибке 500).

Приветствуется любая помощь о том, как передать внешний путь (путь к хосту) через jupyterhub, работающий в контейнере докеров, в экземпляр ноутбука jupyter.


person Heinrich    schedule 13.07.2018    source источник


Ответы (1)


Часто помогает изучение документации и кода. У меня заработало:

В исходном коде dockerspawner https://github.com/jupyterhub/dockerspawner/blob/master/dockerspawner/dockerspawner.py#L218 вариант монтирования файла / каталога хоста в контейнер (однако описание было недостаточно подробным, чтобы я мог понять, как это сделать. С этой целью тесты были полезны : https://github.com/jupyterhub/dockerspawner/blob/3906f4bebc92b383c73fb8d06c58a7c57003939a/tests/volumes_test.py#L25 предлагает указать

notebook_mount_dir = '/path/on/host'
notebook_dir = '/path/in/dockerinstance'
c.DockerSpawner.volumes = {notebook_mount_dir: {"bind": notebook_dir, "mode": "rw"}}

должен заставить его работать, и это действительно так. Надеюсь, это поможет кому-нибудь в будущем.

person Heinrich    schedule 15.07.2018