flagflag  
Page Top

Install anchor.png

(jupyterhub) # pip --no-cache-dir install git+https://github.com/jupyterhub/dockerspawner.git
or
(jupyterhub) # pip install dockerspawner
 
Page Top

設定 anchor.png

 
Page Top
設定ファイル(サンプル) anchor.png
Page Top

Docker Images anchor.png

Page Top
jupyterhub-sigleuser anchor.png
  • docker pull jupyterhub/singleuser
     
Page Top
datascience-notebook anchor.png
  • docker pull jupyter/datascience-notebook
     
Page Top

新しい起動用 Docker イメージの作り方 anchor.png

Page Top
Dockerfile を使う方法 anchor.png
# vi Dockerfile
# cp (何処か)/start.sh .
# docker build -t jupyter_single-test .
# docker images
  • Dockerfile
    FROM jupyterhub/singleuser
    USER root
    COPY start.sh /usr/local/bin
    RUN apt-get update \
     && apt-get install -y --no-install-recommends \
       vim \
     && apt-get -y clean \
     && rm -rf /var/lib/apt/lists/*
Page Top
Docker commit でイメージを作ると,二重引数の問題が発生 anchor.png
  • iseki でログイン時
    # docker exec -it jupyter-iseki /bin/bash
    cd /home/
    mv iseki jovyan
    mkdir student
    cd teacher/iseki
    cp ./back_orign
    cp start.sh /usr/local/bin
    exit
    # docker commit jupyter-iseki  new-image
  • back_orign
     1 #!/bin/bash
     2 cp group /etc/group
     3 cp group /etc/group-
     4 cp passwd /etc/passwd
     5 cp passwd /etc/passwd-
     6 cp /etc/gshadow- /etc/gshadow
     7 cp /etc/shadow- /etc/shadow
     8 cp /etc/subgid- /etc/subgid
     9 cp /etc/subuid- /etc/subuid
Page Top
start.sh(改), start.sh(オリジナル) anchor.png
  • コンテナ内の /usr/local/bin/start.sh
    • コンテナ内の環境設定スクリプト
  • 利用できる環境変数
    SHELL=/bin/bash
    USER_ID=10015
    MINIFORGE_VERSION=4.9.2-0
    HOSTNAME=58f17edda0c7
    LANGUAGE=en_US.UTF-8
    JUPYTERHUB_API_TOKEN=d8137932ac144ebaa70bb04ba359fbac
    JUPYTERHUB_BASE_URL=/
    NB_UID=10015
    PWD=/home/teacher/iseki
    NB_NOTEDIRX=/home/{groupname}/{username}/work
    GRANT_SUDO=yes
    JUPYTERHUB_SERVER_NAME=
    HOME=/home/teacher/iseki
    LANG=en_US.UTF-8
    JPY_API_TOKEN=d8137932ac144ebaa70bb04ba359fbac
    NB_GID=10001
    CHOWN_HOME=yes
    JUPYTERHUB_SERVICE_PREFIX=/user/iseki/
    JUPYTERHUB_OAUTH_CALLBACK_URL=/user/iseki/oauth_callback
    NB_GROUP=teacher
    USER=iseki
    SHLVL=1 
    CONDA_DIR=/opt/conda
    JUPYTERHUB_API_URL=http://172.22.1.75:8081/hub/api
    JUPYTERHUB_CLIENT_ID=jupyterhub-user-iseki
    JUPYTERHUB_HOST=
    CONDA_VERSION=4.9.2
    NB_USER=iseki
    LC_ALL=en_US.UTF-8 
    PATH=/opt/conda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    JUPYTERHUB_USER=iseki
    JUPYTERHUB_ACTIVITY_URL=http://172.22.1.75:8081/hub/api/users/iseki/activity
    DEBIAN_FRONTEND=noninteractive
    _=/usr/bin/env
 
Page Top

新しいクラスを作成する anchor.png

  • /usr/local/anaconda/envs/jupyterhub/lib/​python3.8/site-packages/dockerspawner/
    • edit __init__.py
    • ex.) nsldockerspawner.py
      ......
      from dockerspawner import DockerSpawner
      
      class NSLDockerSpawner(DockerSpawner): 
      ......
      def some_func(self):
          ret = super(NSLDockerSpawner, self).some_func()
          .....
          return ret
      ......
      def start(self, *, image=None, extra_create_kwargs=None, extra_host_config=None):
          .......
          return super(NSLDockerSpawner, self).start()
       
Page Top
MDLDockerSpawner anchor.png
  476  # refer: https://gist.github.com/marufeuille/596cf6f9e26fa6fcb7e304d5b163c7c8
  477  from dockerspawner import SystemUserSpawner
  478  from traitlets import Unicode
  479  import pwd, os, grp
  480
  481  class ProjectDockerSpawner(SystemUserSpawner):
  482
  483      dobleArguments = False
  484      #dobleArguments = True
  485
  486
  487      host_homedir_format_string = Unicode(
  488          "/home/{groupname}/{username}",
  489          config = True,
  490      )
  491
  492      image_homedir_format_string = Unicode(
  493          "/home/{groupname}/{username}",
  494          config = True,
  495      )
  496
  497
  498      @property
  499      def host_homedir(self):
  500          if (
  501              self.host_homedir_format_string is not None
  502              and self.host_homedir_format_string != ""
  503          ):
  504              homedir = self.host_homedir_format_string.format(username=self.user.name, groupname=self.get_groupname())
  505          else:
  506              import pwd
  507
  508              homedir = pwd.getpwnam(self.user.name).pw_dir
  509          return homedir
  510
  511
  512      @property
  513      def homedir(self):
  514          return self.image_homedir_format_string.format(username=self.user.name, groupname=self.get_groupname())
  515
  516
  517      def get_args(self):
  518          args = super(ProjectDockerSpawner, self).get_args()
  519          if (not self._user_set_cmd) and self.dobleArguments:
  520              args = []
  521          return args
  522
  523
  524      #def get_command(self):
  525      #    cmd = super(ProjectDockerSpawner, self).get_command()
  526      #    return cmd
  527      #
  528      #    '''
  529      #    if self._user_set_cmd:
  530      #        cmd = self.cmd
  531      #    else:
  532      #        image_info = yield self.docker("inspect_image", self.image)
  533      #        cmd = image_info["Config"]["Cmd"]
  534      #    return cmd + self.get_args()
  535      #    '''
  536
  537
  538      def template_namespace(self):
  539          d = super(ProjectDockerSpawner, self).template_namespace()
  540          if self.group_id >= 0:
  541              d['groupname'] = self.get_groupname()
  542          return d
  543
  544
  545      def get_groupname(self):
  546          gname = ''
  547          if self.group_id >= 0:
  548              gname = grp.getgrgid(self.group_id).gr_name
  549          return gname
  550
  551
  552      def get_env(self):
  553          env = super(ProjectDockerSpawner, self).get_env()
  554          if self.group_id >= 0:
  555              #env.update(NB_GID=self.group_id)
  556              import grp
  557              gname = self.get_groupname()
  558              env.update(NB_GROUP=gname)
  559          return env
  560
  561
  562      def start(self):
  563          name = self.user.name
  564          user_data = pwd.getpwnam(name)
  565          user_gid = user_data.pw_gid
  566          gid_list = os.getgrouplist(name, user_gid)
  567
  568          work_dir = self.notebook_dir
  569          self.volumes['jupyterhub-user-{username}'] = work_dir
  570
  571          for gid in gid_list:
  572              gname = grp.getgrgid(gid).gr_name
  573              if gname.startswith("project-"):
  574                  dirname = gname.replace("project-", "")
  575                  self.volumes[gname] = work_dir + '/projects/' + dirname
  576
  577          return super(ProjectDockerSpawner, self).start()
 
 
Page Top

Tools anchor.png

Page Top
アイドルしている Docker コンポーネントを殺す! anchor.png
Page Top
jupyterhub​-idle-culler anchor.png
  • pip で入れると No module named が出て,動かない模様
    • No module named jupyterhub_idle_culler
  • 期待通りに動かん!
  • jupyterhub_config.py
    lmport sys
    
    c.JupyterHub.services = [
       {
           'name': 'idle-culler',
           'admin': True,
           'command': [
               sys.executable,
               '-m', 'jupyterhub_idle_culler',
               '--timeout=3600'
           ],
       }
    ]
Page Top
cull_idle_servers.py anchor.png
  • 実行状態(run)も確実に殺してくれる(stop でなくて, rm).
  • Webで開いたままだとダメ
  • jupyterhub_config.py
    import sys
    
    c.JupyterHub.services = [
       {
           'name': 'idle-culler',
           'admin': True,
           'command': [
               sys.executable,
               '/usr/local/bin/cull_idle_servers.py',
               '--timeout=3600'
           ],
       }
    ]
     
Page Top

Trouble Shooting anchor.png

Page Top
新しいファイルがパーミッションが無いとして,作成できない. anchor.png
  • SystemUserSpawnar の場合は,まず現実のファイルのパーミッションをチェック
  • コンテナ内 に入って,ファイルのパーミッションをチェック. (力ずく!)
  • start.sh の設定がダメダメだった.
    • start.sh 内でパーミッションを設定すれば OK
 
Page Top

Hack anchor.png

Page Top

DockerSpawner が self.get_env() で取れる情報 anchor.png

{
    'JUPYTERHUB_API_TOKEN': 'cfd4fbcd6ea6491492016765dbbf4805',
    'JPY_API_TOKEN': 'cfd4fbcd6ea6491492016765dbbf4805',
    'JUPYTERHUB_CLIENT_ID': 'jupyterhub-user-bob',
    'JUPYTERHUB_HOST': '',
    'JUPYTERHUB_OAUTH_CALLBACK_URL': '/user/bob/oauth_callback',
    'JUPYTERHUB_USER': 'bob',
    'JUPYTERHUB_SERVER_NAME': '',
    'JUPYTERHUB_API_URL': 'http://172.22.1.75:8081/hub/api',
    'JUPYTERHUB_ACTIVITY_URL': 'http://172.22.1.75:8081/hub/api/users/bob/activity',
    'JUPYTERHUB_BASE_URL': '/',
    'JUPYTERHUB_SERVICE_PREFIX': '/user/bob/',
    'GRANT_SUDO': 'yes',
    'USER': 'bob',
    'NB_USER': 'bob',
    'USER_ID': 1001,
    'NB_UID': 1001,
    'HOME': '/home/users/bob',
    'NB_GID': 100
}
Page Top

認証モジュール anchor.png

  • /usr/local/anaconda/envs/jupyterhub/lib/​python3.8/site-packages/ldapauthenticato​r/
  • /usr/local/anaconda/envs/jupyterhub/lib/​python3.8/site-packages/ltiauthenticator​/
  • /usr/local/anaconda/envs/jupyterhub/lib/​python3.8/site-packages/jupyterhub/auth.​py
     
Page Top

Groups毎にマウントするボリュームを変える anchor.png

Page Top

Users anchor.png

Page Top

singleuser (コンテナ内) anchor.png

Page Top
プロセスの起動順 anchor.png
  1. /opt/conda/bin/tini
  2. /usr/local/bin/start-notebook.sh
  3. /usr/local/bin/start-singleuser.sh
  4. /usr/local/bin/start.sh
Page Top
最終的に起動されるプロセス anchor.png
  • /usr/local/bin/start.sh jupyterhub-singleuser "$@"
  • /usr/local/bin/start.sh jupyter lab "$@"
  • /usr/local/bin/start.sh jupyter notebook "$@"
Page Top
デフォルトの引数例 $@ anchor.png
  • --ip=0.0.0.0 --port=8888 --notebook-dir=/home/iseki/work --NotebookApp.default_url=/lab
     
Page Top
start.sh anchor.png
Page Top
起動コマンド anchor.png
tini -g -- \
start-notebook.sh --ip=0.0.0.0 --port=8888 --notebook-dir=/home/teacher/iseki/jupyter --SingleUserNotebookApp.default_url=/lab
sudo -E -H -u iseki PATH=/opt/conda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin XDG_CACHE_HOME=/home/teacher/iseki/.cache PYTHONPATH=  \
jupyterhub-singleuser --ip=0.0.0.0 --port=8888 --notebook-dir=/home/teacher/iseki/jupyter --SingleUserNotebookApp.default_url=/lab
Page Top

Docker の起動 anchor.png

  • Docker の起動コマンド
    • /usr/local/anaconda/envs/jupyterhub/lib/​python3.8/site-packages/dockerspawner/do​ckerspawner.py
    • L804 の get_command()
       
Page Top

設定ファイルから,パラメータ(引数)を渡す anchor.png

Page Top
下記機能の実現は環境変数によっても可能 anchor.png
  • file
    /usr/local/anaconda/envs/jupyterhub/lib/python3.8/site-packages/jupyterhub/spawner.py
  • Docker に渡す引数の制御
    • 任意のパラメータ(引数)に {username} 等を使用可能にする
      c.DockerSpawner.args = ['--username={username}']
    • self.format_string() を通すと {...} を処理してくれる.
  • 注:SystemUserSpawner が正しく動けば, コンテナ内の環境変数 NB_USER で取れるので,以下のコード修正は不要
    • さらに jupyterhub_config.py 内などで新しい Class を定義してやれば,グループ名も取れる!
       
Page Top
code anchor.png
  • /usr/local/anaconda/envs/jupyterhub/lib/​python3.8/site-packages/jupyterhub/spawn​er.py
  • 継承を使う方がスマート
  • 1.0.0
    936         if self.debug:
    937             args.append('--debug')
    938
    939         if self.disable_user_config:
    940             args.append('--disable-user-config')
    941         # Fumi
    942         #args.extend(self.args)
    943         for arg in self.args:
    944             args.append(self.format_string(arg))
    945         return args
  • 1.4.1
    --- envs/jupyterhub/lib/python3.8/site-packages/jupyterhub/spawner.py.orig     2021-07-04 23:06:38.269817910 +0900
    +++ envs/jupyterhub/lib/python3.8/site-packages/jupyterhub/spawner.py  2021-07-04 23:07:45.485894520 +0900
    @@ -1024,7 +1024,10 @@
                 args.append('--debug')
             if self.disable_user_config:
                 args.append('--disable-user-config')
    -        args.extend(self.args)
    +        ## Fumi Hax
    +        #args.extend(self.args)
    +        for arg in self.args:
    +            args.append(self.format_string(arg))
             return args
    
         def run_pre_spawn_hook(self):

Front page   Freeze Diff Backup Copy Rename Reload   New List of Pages Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom)
Counter: 1722, today: 2, yesterday: 4
Last-modified: 2021-10-16 (Sat) 14:22:59 (JST) (932d) by iseki

Site Search

Login

Username:

Password:


Lost Password?
Register now!!

Sub Menu

mini Calendar

Last MonthMay 2024Next Month
Su Mo Tu We Th Fr Sa
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Today

Who's Online

101 user(s) are online (21 user(s) are browsing xpwiki)

Members: 0
Guests: 101

more...

Access Counter

Today : 4553455345534553
Yesterday : 1716817168171681716817168
Total : 2350101423501014235010142350101423501014235010142350101423501014
Powered by XOOPS Cube 2.1© 2001-2006 XOOPS Cube Project
Design by XoopsDesign.com