Итак, вот что я пытаюсь достичь:
- Сервер Jupyterhub
- , который при доступе и отсутствии входа в систему переносит вас на другой веб-сервер (пользовательский закодировано в Django)
- Этот веб-сервер использует OAuth для аутентификации пользователя
- И контейнер ноутбука создается.
- Этот контейнер ноутбука должен быть предварительно заполнен токен, который используется пользовательской библиотекой, вставленной в изображение ноутбука Docker для аутентификации в службе.
- Контейнер ноутбука должен иметь возможность взаимодействовать с веб-сервером для дальнейшего взаимодействия, такого как получение результатов и т.д. c.
Я более или менее достиг этого, за исключением последней части. Я запускаю сервер ноутбуков, но у него нет доступа к внешнему миру. Он может получить доступ только к Jupyter Hub (именно поэтому он работает!) И ничего больше.
Вот моя конфигурация Jupyter Hub, относящаяся к DockerSpawner (я опускаю настройки OAuth, поскольку они работают как положено.
# Tell JupyterHub that we want Docker Spawner to be used.
c.JupyterHub.spawner_class = 'dockerspawner.DockerSpawner'
# And what image should be used by the Docker Spawner
c.DockerSpawner.image = 'jupyter/scipy-notebook:7a0c7325e470'
# The Hub must listen on all interfaces.
c.JupyterHub.hub_ip = '0.0.0.0'
# And this should be the address of the Hub API
c.JupyterHub.hub_connect_ip = 'jupyterhub'
# Ask containers to connect to this network so that they can
# communicate with the Hub.
c.DockerSpawner.network_name = 'djangodockerjupyterdemo_default'
# And let's not make a mess, remove user containers when done.
c.DockerSpawner.remove = True
# We need to set the Notebook Directory
notebook_dir = '/home/jovyan/work'
c.DockerSpawner.notebook_dir = notebook_dir
# Need to tell where to mount the volumes.
c.DockerSpawner.volumes = { 'jupyterhub-user-{username}': notebook_dir }
Обратите внимание, что djangodockerjupyterdemo_default
создается с помощью docker -compose благодаря названию каталога проекта (я знаю, что это не лучшая вещь, но сейчас я Я просто надеюсь, что будет работать минимальный пример.)
Вот мой docker -компонент:
version: "2"
services:
database:
image: "mysql:5.6"
volumes:
- ./data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=test123
- MYSQL_DATABASE=oauthserver
- MYSQL_USER=oauthadmin
- MYSQL_PASSWORD=test123
webapp:
image: auth_server:latest
volumes:
- ./:/app
links:
- database:database
environment:
- PYTHONUNBUFFERED=1
- ENV=DEV
- DATABASE_HOST=database
- DATABASE_USER=oauthadmin
- DATABASE_DBNAME=oauthserver
- DATABASE_PASSWORD=test123
hostname: oauthserver.ddi.in
jupyterhub:
image: "jupyterhub:test"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:rw"
- "./jupyterhub:/srv/jupyterhub"
environment:
- OAUTH2_AUTHORIZE_URL=http://oauthserver.ddi.in:8000/o/authorize
- OAUTH2_TOKEN_URL=http://oauthserver.ddi.in:8000/o/token/
hostname: jhtest.ddi.in
links:
- webapp:oauthserver.ddi.in
Я использую https://hub.docker.com/r/defreitas/dns-proxy-server для доступа к Сервер JupyterHub, сказав «http://jhtest.ddi.in: 8000 ».
Теперь, когда контейнеры работают, вот что я могу подтвердить:
docker exec
вставка в webapp
или jupyterhub
контейнеров, а затем wget
загрузка файла из некоторого места в Inte rnet работает. docker exec
вставка в порожденный контейнер для ноутбуков Jupyter и выполнение тех же действий нет. То же самое касается попытки использовать requests.get()
внутри ноутбука.
Как я могу сделать порожденный ноутбук доступ к внешнему миру? Это важно для моего варианта использования (и я уверен, что разумное ожидание).
PS: я заметил, что нет никаких примеров, охватывающих установку OAuth JupyterHub с пользовательским приложением Django. Я надеюсь опубликовать sh мой пример публично и, надеюсь, он может послужить источником для документации по Jupyter Hub.