jupyterhub / dockerspawner

Spawns JupyterHub single user servers in Docker containers
https://jupyterhub-dockerspawner.readthedocs.io
BSD 3-Clause "New" or "Revised" License
490 stars 308 forks source link

Converting Docker Spawner config to Image Spawner config #211

Closed tjesser-ucdavis-edu closed 5 years ago

tjesser-ucdavis-edu commented 6 years ago

This is a crosspost from https://github.com/ryanlovett/imagespawner/issues/5 as the repo appears to not be active. It may be that dockerspawner was simply extended incorrectly, so documentation about extending dockerspawner would be helpful.


I have been trying to use imagespawner unsuccessfully. I have a config that can successfully load and run a notebook with the spawner class dockerspawner, but after selecting a container using imagespawner (at the container selection screen), fails with a 500 error.

Any help would be appreciated.

Working config:

jupyter-backend@|[site name]|:~/jupyterhub$ sed -r '/^((#.*$)|$)/d' jupyterhub_config.py
from oauthenticator.github import GitHubOAuthenticator
c.JupyterHub.authenticator_class = GitHubOAuthenticator
c.JupyterHub.concurrent_spawn_limit = 16
c.JupyterHub.cookie_secret_file = '/home/jupyter-backend/jupyterhub/jupyterhub_cookie_secret'
c.JupyterHub.db_url = '/home/jupyter-backend/jupyterhub/jupyterhub.sqlite'
import os
c.JupyterHub.hub_connect_ip = os.environ["DOCKER_GATEWAY_IP"]
c.JupyterHub.hub_ip = '0.0.0.0'
c.JupyterHub.port = 443
c.JupyterHub.spawner_class = "dockerspawner.DockerSpawner"
c.JupyterHub.ssl_cert = '/etc/letsencrypt/live/|[site url]|/fullchain.pem'
c.JupyterHub.ssl_key = '/etc/letsencrypt/live/|[site url]|/privkey.pem'
c.Spawner.debug = True
c.DockerSpawner.image = "jupyter/scipy-notebook"
import os
c.GitHubOAuthenticator.oauth_callback_url = os.environ["OAUTH_CALLBACK_URL"]
c.GitHubOAuthenticator.client_id = os.environ["OAUTH_CLIENT_ID"]
c.GitHubOAuthenticator.client_secret = os.environ["OAUTH_CLIENT_SECRET"]

Non-working config:

jupyter-backend@|[site name]|:~/jupyterhub$ sed -r '/^((#.*$)|$)/d' jupyterhub_config.py
from oauthenticator.github import GitHubOAuthenticator
c.JupyterHub.authenticator_class = GitHubOAuthenticator
c.JupyterHub.concurrent_spawn_limit = 16
c.JupyterHub.cookie_secret_file = '/home/jupyter-backend/jupyterhub/jupyterhub_cookie_secret'
c.JupyterHub.db_url = '/home/jupyter-backend/jupyterhub/jupyterhub.sqlite'
import os
c.JupyterHub.hub_connect_ip = os.environ["DOCKER_GATEWAY_IP"]
c.JupyterHub.hub_ip = '0.0.0.0'
c.JupyterHub.port = 443
c.JupyterHub.spawner_class = "imagespawner.DockerImageChooserSpawner"
c.JupyterHub.ssl_cert = '/etc/letsencrypt/live/|[site url]|/fullchain.pem'
c.JupyterHub.ssl_key = '/etc/letsencrypt/live/|[site url]|/privkey.pem'
c.Spawner.debug = True
c.DockerImageChooserSpawner.dockerimages = [
        "jupyter/scipy-notebook",
]
import os
c.GitHubOAuthenticator.oauth_callback_url = os.environ["OAUTH_CALLBACK_URL"]
c.GitHubOAuthenticator.client_id = os.environ["OAUTH_CLIENT_ID"]
c.GitHubOAuthenticator.client_secret = os.environ["OAUTH_CLIENT_SECRET"]

Config diff:

-c.JupyterHub.spawner_class = "dockerspawner.DockerSpawner"
+c.JupyterHub.spawner_class = "imagespawner.DockerImageChooserSpawner"
---
-c.DockerSpawner.image = "jupyter/scipy-notebook"
+c.DockerImageChooserSpawner.dockerimages = [
+        "jupyter/scipy-notebook",
+]

Website error message:

500 : Internal Server Error

Failed to reach your server. Please try again later. Contact admin if the issue persists. You can try restarting your server from the home page.

JupyterHub debug log:

jupyterhub \
    --debug \
    --config="${HOME}/jupyterhub/jupyterhub_config.py"
+ jupyterhub --debug --config=/home/jupyter-backend/jupyterhub/jupyterhub_config.py
[D 2017-12-13 17:53:08.709 JupyterHub application:555] Looking for /home/jupyter-backend/jupyterhub/jupyterhub_config in /home/jupyter-backend
[D 2017-12-13 17:53:08.712 JupyterHub application:577] Loaded config file: /home/jupyter-backend/jupyterhub/jupyterhub_config.py
[D 2017-12-13 17:53:08.786 JupyterHub app:866] Generating new cookie_secret
[I 2017-12-13 17:53:08.786 JupyterHub app:871] Writing cookie_secret to /home/jupyter-backend/jupyterhub/jupyterhub_cookie_secret
[D 2017-12-13 17:53:08.786 JupyterHub app:886] Connecting to db: sqlite:////home/jupyter-backend/jupyterhub/jupyterhub.sqlite
[D 2017-12-13 17:53:08.794 JupyterHub orm:475] Stamping empty database with alembic revision 3ec6993fe20c
[I 2017-12-13 17:53:08.814 alembic.runtime.migration migration:117] Context impl SQLiteImpl.
[I 2017-12-13 17:53:08.814 alembic.runtime.migration migration:122] Will assume non-transactional DDL.
[I 2017-12-13 17:53:08.874 alembic.runtime.migration migration:327] Running stamp_revision  -> 3ec6993fe20c
[D 2017-12-13 17:53:08.875 alembic.runtime.migration migration:516] new branch insert 3ec6993fe20c
[W 2017-12-13 17:53:09.293 JupyterHub app:955] No admin users, admin interface will be unavailable.
[W 2017-12-13 17:53:09.293 JupyterHub app:956] Add any administrative users to `c.Authenticator.admin_users` in config.
[I 2017-12-13 17:53:09.294 JupyterHub app:983] Not using whitelist. Any authenticated user will be allowed.
[D 2017-12-13 17:53:09.332 JupyterHub app:1241] Loaded users:
[I 2017-12-13 17:53:09.337 JupyterHub app:1528] Hub API listening on http://0.0.0.0:8081/hub/
[W 2017-12-13 17:53:09.338 JupyterHub proxy:415]
    Generating CONFIGPROXY_AUTH_TOKEN. Restarting the Hub will require restarting the proxy.
    Set CONFIGPROXY_AUTH_TOKEN env or JupyterHub.proxy_auth_token config to avoid this message.
Dec 13 17:53:09 |[site name]| run_jupyterhub.sh[9231]:
[I 2017-12-13 17:53:09.338 JupyterHub proxy:458] Starting proxy @ https://*:443/
[D 2017-12-13 17:53:09.338 JupyterHub proxy:459] Proxy cmd: ['configurable-http-proxy', '--ip', '', '--port', '443', '--api-ip', '127.0.0.1', '--api-port', '8001', '--error-target', '
17:53:09.451 - info: [ConfigProxy] Proxying https://*:443 to (no default)
17:53:09.453 - info: [ConfigProxy] Proxy API at http://127.0.0.1:8001/api/routes
[D 2017-12-13 17:53:09.575 JupyterHub proxy:491] Proxy started and appears to be up
[D 2017-12-13 17:53:09.577 JupyterHub proxy:552] Proxy: Fetching GET http://127.0.0.1:8001/api/routes
[W 2017-12-13 17:53:09.613 JupyterHub proxy:304] Adding missing default route
[I 2017-12-13 17:53:09.613 JupyterHub proxy:370] Adding default route for Hub: / => http://172.17.0.1:8081
[D 2017-12-13 17:53:09.613 JupyterHub proxy:552] Proxy: Fetching POST http://127.0.0.1:8001/api/routes/
17:53:09.613 - info: [ConfigProxy] 200 GET /api/routes
17:53:09.620 - info: [ConfigProxy] Adding route / -> http://172.17.0.1:8081
17:53:09.621 - info: [ConfigProxy] 201 POST /api/routes/
[I 2017-12-13 17:53:09.621 JupyterHub app:1581] JupyterHub is now running at https://:443/
[I 2017-12-13 17:53:11.859 JupyterHub log:122] 302 GET /user/tjesser-ucdavis-edu/api/terminals?_=1513215013799 → /hub/user/tjesser-ucdavis-edu/api/terminals?_=1513215013799 (@::ffff:1
[I 2017-12-13 17:53:11.860 JupyterHub log:122] 302 GET /user/tjesser-ucdavis-edu/api/sessions?_=1513215013798 → /hub/user/tjesser-ucdavis-edu/api/sessions?_=1513215013798 (@::ffff:128
[W 2017-12-13 17:53:11.900 JupyterHub base:202] Invalid or expired cookie token
[W 2017-12-13 17:53:11.901 JupyterHub base:202] Invalid or expired cookie token
[I 2017-12-13 17:53:11.901 JupyterHub log:122] 302 GET /hub/user/tjesser-ucdavis-edu/api/sessions?_=1513215013798 → /hub/login?next=%2Fhub%2Fuser%2Ftjesser-ucdavis-edu%2Fapi%2Fsession
[W 2017-12-13 17:53:11.912 JupyterHub base:202] Invalid or expired cookie token
[W 2017-12-13 17:53:11.914 JupyterHub base:202] Invalid or expired cookie token
[I 2017-12-13 17:53:11.914 JupyterHub log:122] 302 GET /hub/user/tjesser-ucdavis-edu/api/terminals?_=1513215013799 → /hub/login?next=%2Fhub%2Fuser%2Ftjesser-ucdavis-edu%2Fapi%2Ftermin
[I 2017-12-13 17:53:11.997 JupyterHub log:122] 200 GET /hub/login?next=%2Fhub%2Fuser%2Ftjesser-ucdavis-edu%2Fapi%2Fsessions%3F_%3D1513215013798 (@::ffff:128.120.246.252) 21.77ms
[I 2017-12-13 17:53:11.998 JupyterHub log:122] 200 GET /hub/login?next=%2Fhub%2Fuser%2Ftjesser-ucdavis-edu%2Fapi%2Fterminals%3F_%3D1513215013799 (@::ffff:128.120.246.252) 0.67ms
[I 2017-12-13 17:53:16.038 JupyterHub log:122] 302 GET / → /hub (@::ffff:128.120.246.252) 0.80ms
[I 2017-12-13 17:53:16.070 JupyterHub log:122] 302 GET /hub → /hub/login (@::ffff:128.120.246.252) 0.76ms
[I 2017-12-13 17:53:16.101 JupyterHub log:122] 200 GET /hub/login (@::ffff:128.120.246.252) 1.67ms
[D 2017-12-13 17:53:16.283 JupyterHub log:122] 304 GET /favicon.ico (@::ffff:128.120.246.252) 2.23ms
[I 2017-12-13 17:53:19.323 JupyterHub oauth2:82] OAuth redirect: 'https://|[site url]|/hub/oauth_callback'
[I 2017-12-13 17:53:19.324 JupyterHub log:122] 302 GET /hub/oauth_login?next= → https://github.com/login/oauth/authorize?redirect_uri=https%3A%2F%2F|[site url]|%2Fhub%2Foau
[D 2017-12-13 17:53:21.493 JupyterHub base:268] Setting cookie for tjesser-ucdavis-edu: jupyter-hub-token, {'httponly': True, 'secure': True}
[I 2017-12-13 17:53:21.493 JupyterHub base:346] User logged in: tjesser-ucdavis-edu
[D 2017-12-13 17:53:21.493 JupyterHub user:184] Creating <class 'imagespawner.imagespawner.DockerImageChooserSpawner'> for tjesser-ucdavis-edu:
[I 2017-12-13 17:53:21.514 JupyterHub log:122] 302 GET /hub/oauth_callback?code=c175629286ec34253a18&state=eyJzdGF0ZV9pZCI6ICJjYmQ2ZDhmYjc2NTk0MDFjYTE3YTRlNTkxYWM4NTk1OCIsICJuZXh0X3Vy
[D 2017-12-13 17:53:21.541 JupyterHub pages:54] User is not running: /hub/home
[I 2017-12-13 17:53:21.542 JupyterHub log:122] 302 GET /hub/ → /hub/home (tjesser-ucdavis-edu@::ffff:128.120.246.252) 1.73ms
[I 2017-12-13 17:53:21.577 JupyterHub log:122] 200 GET /hub/home (tjesser-ucdavis-edu@::ffff:128.120.246.252) 15.35ms
[D 2017-12-13 17:53:21.787 JupyterHub log:122] 304 GET /favicon.ico (@::ffff:128.120.246.252) 1.28ms
[I 2017-12-13 17:53:24.054 JupyterHub log:122] 200 GET /hub/spawn (tjesser-ucdavis-edu@::ffff:128.120.246.252) 7.55ms
[D 2017-12-13 17:53:24.274 JupyterHub log:122] 304 GET /favicon.ico (@::ffff:128.120.246.252) 1.07ms
[D 2017-12-13 17:53:27.620 JupyterHub base:421] Initiating spawn for tjesser-ucdavis-edu
[D 2017-12-13 17:53:27.795 JupyterHub dockerspawner:444] Getting container 'jupyter-jupyter-scipy-notebook-tjesser-ucdavis-edu'
[D 2017-12-13 17:53:27.798 JupyterHub base:427] 0/16 concurrent spawns
[D 2017-12-13 17:53:27.799 JupyterHub base:430] 0 active servers
[I 2017-12-13 17:53:27.807 JupyterHub dockerspawner:452] Container 'jupyter-jupyter-scipy-notebook-tjesser-ucdavis-edu' is gone
[D 2017-12-13 17:53:27.810 JupyterHub dockerspawner:530] Starting host with config: {'binds': {}, 'links': {}, 'port_bindings': {8888: ('127.0.0.1',)}, 'network_mode': 'bridge'}
[I 2017-12-13 17:53:27.950 JupyterHub dockerspawner:540] Created container 'jupyter-jupyter-scipy-notebook-tjesser-ucdavis-edu' (id: 9d0ea65) from image jupyter/scipy-notebook
[I 2017-12-13 17:53:27.950 JupyterHub dockerspawner:557] Starting container 'jupyter-jupyter-scipy-notebook-tjesser-ucdavis-edu' (id: 9d0ea65)
[W 2017-12-13 17:53:28.347 JupyterHub user:385] DEPRECATION: Spawner.start should return (ip, port) in JupyterHub >= 0.7
[D 2017-12-13 17:53:28.347 JupyterHub spawner:727] Polling subprocess every 30s
[I 2017-12-13 17:53:29.003 JupyterHub log:122] 200 GET /hub/api (@172.17.0.2) 0.37ms
[D 2017-12-13 17:53:37.801 JupyterHub dockerspawner:444] Getting container 'jupyter-jupyter-scipy-notebook-tjesser-ucdavis-edu'
[D 2017-12-13 17:53:37.807 JupyterHub dockerspawner:430] Container 9d0ea65 status: {'Dead': False,
     'Error': '',
     'ExitCode': 0,
     'FinishedAt': '0001-01-01T00:00:00Z',
     'OOMKilled': False,
     'Paused': False,
     'Pid': 9367,
     'Restarting': False,
     'Running': True,
     'StartedAt': '2017-12-14T01:53:28.296807573Z',
     'Status': 'running'}
[W 2017-12-13 17:53:37.807 JupyterHub base:500] User tjesser-ucdavis-edu is slow to become responsive (timeout=10)
[D 2017-12-13 17:53:37.807 JupyterHub base:502] Expecting server for tjesser-ucdavis-edu at: http://|[site name]|:57421/user/tjesser-ucdavis-edu/
[I 2017-12-13 17:53:37.813 JupyterHub log:122] 302 POST /hub/spawn → /user/tjesser-ucdavis-edu/ (tjesser-ucdavis-edu@::ffff:128.120.246.252) 10197.46ms
[I 2017-12-13 17:53:37.834 JupyterHub log:122] 302 GET /user/tjesser-ucdavis-edu/ → /hub/user/tjesser-ucdavis-edu/ (@::ffff:128.120.246.252) 0.49ms
[D 2017-12-13 17:53:37.865 JupyterHub base:718] Waiting for tjesser-ucdavis-edu pending spawn
[I 2017-12-13 17:53:47.868 JupyterHub base:722] Pending spawn for tjesser-ucdavis-edu didn't finish in 10.0 seconds
[I 2017-12-13 17:53:47.868 JupyterHub base:727] tjesser-ucdavis-edu is pending spawn
[I 2017-12-13 17:53:47.874 JupyterHub log:122] 200 GET /hub/user/tjesser-ucdavis-edu/ (tjesser-ucdavis-edu@::ffff:128.120.246.252) 10011.01ms
[D 2017-12-13 17:53:48.196 JupyterHub log:122] 304 GET /favicon.ico (@::ffff:128.120.246.252) 1.16ms
[D 2017-12-13 17:53:53.158 JupyterHub base:718] Waiting for tjesser-ucdavis-edu pending spawn
[W 2017-12-13 17:53:55.782 JupyterHub user:458] tjesser-ucdavis-edu's server never showed up at http://|[site name]|:57421/user/tjesser-ucdavis-edu/ after 30 seconds. Giving up
[D 2017-12-13 17:53:55.783 JupyterHub dockerspawner:444] Getting container 'jupyter-jupyter-scipy-notebook-tjesser-ucdavis-edu'
[D 2017-12-13 17:53:55.788 JupyterHub dockerspawner:430] Container 9d0ea65 status: {'Dead': False,
     'Error': '',
     'ExitCode': 0,
     'FinishedAt': '0001-01-01T00:00:00Z',
     'OOMKilled': False,
     'Paused': False,
     'Pid': 9367,
     'Restarting': False,
     'Running': True,
     'StartedAt': '2017-12-14T01:53:28.296807573Z',
     'Status': 'running'}
[I 2017-12-13 17:53:55.788 JupyterHub dockerspawner:628] Stopping container jupyter-jupyter-scipy-notebook-tjesser-ucdavis-edu (id: 9d0ea65)
[E 2017-12-13 17:53:56.297 JupyterHub gen:914] Exception in Future <tornado.concurrent.Future object at 0x7f9bd2c49c88> after timeout
    Traceback (most recent call last):
      File "/home/jupyter-backend/miniconda3/lib/python3.6/site-packages/tornado/gen.py", line 910, in error_callback
        future.result()
      File "/home/jupyter-backend/miniconda3/lib/python3.6/site-packages/jupyterhub/handlers/base.py", line 445, in finish_user_spawn
        yield spawn_future
      File "/home/jupyter-backend/miniconda3/lib/python3.6/site-packages/jupyterhub/user.py", line 476, in spawn
        raise e
      File "/home/jupyter-backend/miniconda3/lib/python3.6/site-packages/jupyterhub/user.py", line 450, in spawn
        resp = yield server.wait_up(http=True, timeout=spawner.http_timeout)
      File "/home/jupyter-backend/miniconda3/lib/python3.6/site-packages/jupyterhub/utils.py", line 180, in wait_for_http_server
        timeout=timeout
      File "/home/jupyter-backend/miniconda3/lib/python3.6/site-packages/jupyterhub/utils.py", line 135, in exponential_backoff
        raise TimeoutError(fail_message)
    TimeoutError: Server at http://|[site name]|:57421/user/tjesser-ucdavis-edu/ didn't respond in 30 seconds
Dec 13 17:53:56 |[site name]| run_jupyterhub.sh[9231]:
[E 2017-12-13 17:53:56.300 JupyterHub gen:914] Exception in Future <tornado.concurrent.Future object at 0x7f9bd2c49c88> after timeout
    Traceback (most recent call last):
      File "/home/jupyter-backend/miniconda3/lib/python3.6/site-packages/tornado/gen.py", line 910, in error_callback
        future.result()
      File "/home/jupyter-backend/miniconda3/lib/python3.6/site-packages/jupyterhub/handlers/base.py", line 445, in finish_user_spawn
        yield spawn_future
      File "/home/jupyter-backend/miniconda3/lib/python3.6/site-packages/jupyterhub/user.py", line 476, in spawn
        raise e
      File "/home/jupyter-backend/miniconda3/lib/python3.6/site-packages/jupyterhub/user.py", line 450, in spawn
        resp = yield server.wait_up(http=True, timeout=spawner.http_timeout)
      File "/home/jupyter-backend/miniconda3/lib/python3.6/site-packages/jupyterhub/utils.py", line 180, in wait_for_http_server
        timeout=timeout
      File "/home/jupyter-backend/miniconda3/lib/python3.6/site-packages/jupyterhub/utils.py", line 135, in exponential_backoff
        raise TimeoutError(fail_message)
    TimeoutError: Server at http://|[site name]|:57421/user/tjesser-ucdavis-edu/ didn't respond in 30 seconds
Dec 13 17:53:56 |[site name]| run_jupyterhub.sh[9231]:
[E 2017-12-13 17:53:56.302 JupyterHub web:1590] Uncaught exception GET /hub/user/tjesser-ucdavis-edu/ (::ffff:128.120.246.252)
    HTTPServerRequest(protocol='https', host='|[site url]|', method='GET', uri='/hub/user/tjesser-ucdavis-edu/', version='HTTP/1.1', remote_ip='::ffff:128.120.246.252', hea
    Traceback (most recent call last):
      File "/home/jupyter-backend/miniconda3/lib/python3.6/site-packages/tornado/web.py", line 1511, in _execute
        result = yield result
      File "/home/jupyter-backend/miniconda3/lib/python3.6/site-packages/jupyterhub/handlers/base.py", line 720, in get
        yield gen.with_timeout(timedelta(seconds=self.slow_spawn_timeout), spawner._spawn_future)
      File "/home/jupyter-backend/miniconda3/lib/python3.6/site-packages/jupyterhub/handlers/base.py", line 445, in finish_user_spawn
        yield spawn_future
      File "/home/jupyter-backend/miniconda3/lib/python3.6/site-packages/jupyterhub/user.py", line 476, in spawn
        raise e
      File "/home/jupyter-backend/miniconda3/lib/python3.6/site-packages/jupyterhub/user.py", line 450, in spawn
        resp = yield server.wait_up(http=True, timeout=spawner.http_timeout)
      File "/home/jupyter-backend/miniconda3/lib/python3.6/site-packages/jupyterhub/utils.py", line 180, in wait_for_http_server
        timeout=timeout
      File "/home/jupyter-backend/miniconda3/lib/python3.6/site-packages/jupyterhub/utils.py", line 135, in exponential_backoff
        raise TimeoutError(fail_message)
    TimeoutError: Server at http://|[site name]|:57421/user/tjesser-ucdavis-edu/ didn't respond in 30 seconds
Dec 13 17:53:56 |[site name]| run_jupyterhub.sh[9231]:
[D 2017-12-13 17:53:56.308 JupyterHub base:633] No template for 500
[E 2017-12-13 17:53:56.325 JupyterHub log:114] {
      "X-Forwarded-Host": "|[site url]|",
      "X-Forwarded-Proto": "https",
      "X-Forwarded-Port": "443",
      "X-Forwarded-For": "::ffff:128.120.246.252",
      "Cache-Control": "max-age=0",
      "If-None-Match": "\"64d3e466503cd9f50ef9fda414d9dfd43444ce36\"",
      "Upgrade-Insecure-Requests": "1",
      "Connection": "close",
      "Cookie": "jupyter-hub-token=\"2|1:0|10:1513216401|17:jupyter-hub-token|44:ZTIzZjJiZWJkOTdmNDViOWIzMmUyMDAwYWQyYmU0NWI=|6e7a41fdb7fd32ade821dd78cd9ec20773bdd90bd2e4c918d7d803c90
      "Referer": "https://|[site url]|/hub/spawn",
      "Accept-Encoding": "gzip, deflate, br",
      "Accept-Language": "en-US,en;q=0.5",
      "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
      "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0",
      "Host": "|[site url]|"
    }
[E 2017-12-13 17:53:56.325 JupyterHub log:122] 500 GET /hub/user/tjesser-ucdavis-edu/ (tjesser-ucdavis-edu@::ffff:128.120.246.252) 3167.87ms
[D 2017-12-13 17:53:56.451 JupyterHub log:122] 304 GET /hub/static/css/style.min.css?v=14dc0b5a8b791d573b687aa626aa2600 (@::ffff:128.120.246.252) 0.62ms
[D 2017-12-13 17:53:56.453 JupyterHub log:122] 304 GET /hub/static/components/requirejs/require.js?v=e7199843dfd445bb66ec816e98a03214 (@::ffff:128.120.246.252) 0.60ms
[D 2017-12-13 17:53:56.456 JupyterHub log:122] 304 GET /hub/static/components/jquery/dist/jquery.min.js?v=c9f5aeeca3ad37bf2aa006139b935f0a (@::ffff:128.120.246.252) 0.44ms
[D 2017-12-13 17:53:56.456 JupyterHub log:122] 304 GET /hub/static/components/bootstrap/dist/js/bootstrap.min.js?v=5869c96cc8f19086aee625d670d741f9 (@::ffff:128.120.246.252) 0.36ms
[D 2017-12-13 17:53:56.543 JupyterHub log:122] 304 GET /hub/logo (@::ffff:128.120.246.252) 1.24ms
[D 2017-12-13 17:53:56.681 JupyterHub log:122] 304 GET /favicon.ico (@::ffff:128.120.246.252) 0.46ms
steffenver commented 6 years ago

+1

tjesser-ucdavis-edu commented 6 years ago

Fortunately, ryanlovett was indeed active, and pointed out this PR for dockerspawner https://github.com/jupyterhub/dockerspawner/pull/219. Since it appears that #219 will enable the functionality I need, I will close this issue when it is merged.

manniche commented 5 years ago

219 has been merged, feel free to close the issue