flagflag  If you want to see English page, please click "English" Button at Left.
10: 2021-07-12 (月) 10:15:51 iseki ソース 現: 2021-10-16 (土) 14:22:59 iseki ソース
Line 11: Line 11:
 or  or
 (jupyterhub) # pip install dockerspawner  (jupyterhub) # pip install dockerspawner
 +
 +- pip --no-cache-dir install git+https://github.com/jupyterhub/docker​spawner.git をお勧め
 +
 +#br
*** 設定 [#i5887782] *** 設定 [#i5887782]
Line 20: Line 24:
#br #br
-*** 起動用 Docker images [#w0091afe]+*** Docker Images [#ta8920e4] 
 +**** [[jupyterhub-sigleuser>./jupyterhub-sigl​euser]] [#zf5de082]
- docker pull jupyterhub/singleuser - docker pull jupyterhub/singleuser
 +#br
 +
 +**** datascience-notebook  [#s5b3175e]
- docker pull jupyter/datascience-notebook - docker pull jupyter/datascience-notebook
#br #br
Line 42: Line 50:
  && rm -rf /var/lib/apt/lists/*   && rm -rf /var/lib/apt/lists/*
-**** 二重引数の問題が発生 [#t9a36c00]+**** Docker commit でイメージを作ると,二重引数の問題が発生 [#t9a36c00]
- iseki でログイン時 - iseki でログイン時
 # docker exec -it jupyter-iseki /bin/bash  # docker exec -it jupyter-iseki /bin/bash
Line 64: Line 72:
  9 cp /etc/subuid- /etc/subuid   9 cp /etc/subuid- /etc/subuid
-**** [[start.sh>./start.sh]] [#q31443f9]+- [[解決>#xeab91b6]] 
 +#br 
 + 
 +**** [[start.sh(改)>./start.sh-kai]],  [[start.sh(オリジナル)>./start.sh]][#q31443f9]
- コンテナ内の /usr/local/bin/start.sh - コンテナ内の /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=d8137932ac144ebaa7​0bb04ba359fbac
 + 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=d8137932ac144ebaa70bb04ba​359fbac
 + NB_GID=10001
 + CHOWN_HOME=yes
 + JUPYTERHUB_SERVICE_PREFIX=/user/ise​ki/
 + JUPYTERHUB_OAUTH_CALLBACK_URL=/user/ise​ki/oauth_callback
 + NB_GROUP=teacher
 + USER=iseki
 + SHLVL=1
 + CONDA_DIR=/opt/conda
 + JUPYTERHUB_API_URL=http://172.22.1.75:8​081/hub/api
 + JUPYTERHUB_CLIENT_ID=jupyterhub-user-is​eki
 + JUPYTERHUB_HOST=
 + CONDA_VERSION=4.9.2
 + NB_USER=iseki
 + LC_ALL=en_US.UTF-8
 + PATH=/opt/conda/bin:/usr/local/sbin:/us​r/local/bin:/usr/sbin:/usr/bin:/sbin:/bi​n
 + JUPYTERHUB_USER=iseki
 + JUPYTERHUB_ACTIVITY_URL=http://172.22.1​.75:8081/hub/api/users/iseki/activity
 + DEBIAN_FRONTEND=noninteractive
 + _=/usr/bin/env
 +
#br #br
Line 72: Line 120:
- /usr/local/anaconda/envs/jupyterhub/lib/​python3.8/site-packages/dockerspawner/ - /usr/local/anaconda/envs/jupyterhub/lib/​python3.8/site-packages/dockerspawner/
--- __init__.py+-- edit __init__.py
-- ex.) nsldockerspawner.py -- ex.) nsldockerspawner.py
 ......  ......
 from dockerspawner import DockerSpawner  from dockerspawner import DockerSpawner
 + 
 class NSLDockerSpawner(DockerSpawner):  class NSLDockerSpawner(DockerSpawner):
 ......  ......
Line 87: Line 135:
     .......      .......
     return super(NSLDockerSpawner, self).start()      return super(NSLDockerSpawner, self).start()
 +#br
-*** Trouble Shooting [#j137c8ff]+**** MDLDockerSpawner [#d9dde499] 
 +- 参考:  https://gist.github.com/marufeuille/596c​f6f9e26fa6fcb7e304d5b163c7c8 
 + 
 +   476  # refer: https://gist.github.com/marufeuille/596c​f6f9e26fa6fcb7e304d5b163c7c8 
 +   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(u​sername=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() 
 +  
 +#br
-**** 何故かイメージを変更して commit すると引数が2重になる? (''非常に重要な問題'')[#xeab91b6] 
-- docker logs のでエラーメッセージ 
--- [C 2021-07-11 13:52:21.786 SingleUserNotebookApp application:89] Bad config encountered during initialization: Error loading argument SingleUserNotebookApp.ip=['0.0.0.0', '0.0.0.0'], ip only accepts one value, got 2: ['0.0.0.0', '0.0.0.0'] 
-- /usr/local/anaconda/envs/jupyterhub/lib/​python3.8/site-packages/dockerspawner/do​ckerspawner.py L804 
--- get_command() の cmd + self.get_args() で cmd に既に引数が入っている? 
-- 最新版 (Project用) [[jupyterhub_config.py>../SystemUserSpaw​ner/jupyterhub_config.py]] 内で対症療法中 
-- ''上記の Dockerfile を使って作成すれば問題無し'' 
#br #br
 +
 +*** Tools [#ke66d2d2]
 +**** アイドルしている Docker コンポーネントを殺す! [#uf1854cf]
 +***** %%jupyterhub​-idle-culler%% [#eb3404d4]
 +- jupyterhub_idle_culler
 +- https://github.com/jupyterhub/jupyterhub​-idle-culler
 +
 +- pip で入れると No module named が出て,動かない模様
 +-- No module named jupyterhub_idle_culler
 +
 +- GitHub から直接入れる.
 +-- git clone https://github.com/jupyterhub/jupyterhub​-idle-culler.git
 +-- cd jupyterhub-idle-culler
 +-- python setup.py build
 +-- python setup.py build
 +
 +- ''期待通りに動かん!''
 +
 +- jupyterhub_config.py
 + lmport sys
 + 
 + c.JupyterHub.services = [
 +   {
 +       'name': 'idle-culler',
 +       'admin': True,
 +       'command': [
 +           sys.executable,
 +           '-m', 'jupyterhub_idle_culler',
 +           '--timeout=3600'
 +       ],
 +   }
 + ]
 +
 +***** cull_idle_servers.py [#zc9428f7]
 +- jupyterhub​-idle-culler は期待通りに動かない.cull_idle_servers.py の方が良いみたい.
 +- https://github.com/jupyterhub/jupyterhub​/tree/a6b7e303df03865d6420f6bccdf627b39f​1d0dc1/examples/cull-idle
 +
 +- 実行状態(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'
 +       ],
 +   }
 + ]
 +#br
 +
 +** Trouble Shooting [#j137c8ff]
**** 新しいファイルがパーミッションが無いとして,作成できない. [#z72fb1be] **** 新しいファイルがパーミッションが無いとして,作成できない. [#z72fb1be]
Line 108: Line 314:
#br #br
-** Hack [#gdd93e11]+* Hack [#gdd93e11] 
 +*** カスタマイズ [#p63e4677] 
 +- https://jupyterhub.readthedocs.io/en/sta​ble/reference/spawners.html 
 +#br
-*** Groups [#wefff3af]+*** DockerSpawner が self.get_env() で取れる情報 [#bb38d813] 
 + 
 + { 
 +     '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/b​ob/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 
 + } 
 + 
 +*** 認証モジュール [#xecc82c3] 
 +- /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 
 +#br 
 + 
 +*** Groups毎にマウントするボリュームを変える [#wefff3af]
- https://qiita.com/marufeuille/items/62e3​a842f7a039c35aac - https://qiita.com/marufeuille/items/62e3​a842f7a039c35aac
#br #br
-*** Users [#m3f602dc]+ 
 +** Users [#m3f602dc]
- 以下でやろうとしたこと(ユーザを jovyan以外する)は [[''dockerspawner.SystemUserSpawner''>..​/SystemUserSpawner]] を使用すれば解決するので,没. - 以下でやろうとしたこと(ユーザを jovyan以外する)は [[''dockerspawner.SystemUserSpawner''>..​/SystemUserSpawner]] を使用すれば解決するので,没.
#br #br
Line 135: Line 374:
**** start.sh [#lb268269] **** start.sh [#lb268269]
-- [[start.sh>./start.sh]]+- [[start.sh(改)>./start.sh-kai]]
#br #br
 +
 +**** 起動コマンド [#mde3032e]
 + tini -g -- \
 + start-notebook.sh --ip=0.0.0.0 --port=8888 --notebook-dir=/home/teacher/iseki/jupyt​er --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/.cach​e PYTHONPATH=  \
 + jupyterhub-singleuser --ip=0.0.0.0 --port=8888 --notebook-dir=/home/teacher/iseki/jupyt​er --SingleUserNotebookApp.default_url=/lab​
*** Docker の起動 [#o46a3f42] *** Docker の起動 [#o46a3f42]
Line 144: Line 390:
#br #br
*** 設定ファイルから,パラメータ(引数)を渡す [#y62d4f07] *** 設定ファイルから,パラメータ(引数)を渡す [#y62d4f07]
 +**** 下記機能の実現は環境変数によっても可能 [#da119405]
- file - file
 /usr/local/anaconda/envs/jupyterhub/lib​/python3.8/site-packages/jupyterhub/spaw​ner.py  /usr/local/anaconda/envs/jupyterhub/lib​/python3.8/site-packages/jupyterhub/spaw​ner.py
Line 149: Line 396:
-- 任意のパラメータ(引数)に ''{username}'' 等を使用可能にする -- 任意のパラメータ(引数)に ''{username}'' 等を使用可能にする
 c.DockerSpawner.args = ['--username={username}']  c.DockerSpawner.args = ['--username={username}']
--- self.format_string() を通すと {...} を処理してくれる.+-- ''self.format_string''() を通すと {...} を処理してくれる.
- ''注:''[[SystemUserSpawner>../SystemUserSpawn​er]] が正しく動けば, コンテナ内の環境変数 NB_USER で取れるので,''以下のコード修正は不要''. - ''注:''[[SystemUserSpawner>../SystemUserSpawn​er]] が正しく動けば, コンテナ内の環境変数 NB_USER で取れるので,''以下のコード修正は不要''.
Line 155: Line 402:
#br #br
-**** code [#td63949c] +***** code [#td63949c] 
-***** /usr/local/anaconda/envs/jupyterhub/lib/​python3.8/site-packages/jupyterhub/spawn​er.py [#ba454e16]+ 
 +- /usr/local/anaconda/envs/jupyterhub/lib/​python3.8/site-packages/jupyterhub/spawn​er.py 
 +- 継承を使う方がスマート
- 1.0.0 - 1.0.0
 936        if self.debug:  936        if self.debug:
Line 182: Line 431:
 +            args.append(self.format_string(arg))  +            args.append(self.format_string(arg))
         return args          return args
 + 
     def run_pre_spawn_hook(self):      def run_pre_spawn_hook(self):


トップ   新規 ページ一覧 単語検索 最終更新   ヘルプ   最終更新のRSS 1.0 最終更新のRSS 2.0 最終更新のRSS Atom

サイト内 検索

ログイン

ユーザー名:

パスワード:


パスワード紛失
新規登録

サブ メニュー

ミニカレンダー

前月2024年 5月翌月
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
<今日>

オンライン状況

106 人のユーザが現在オンラインです。 (15 人のユーザが xpwiki を参照しています。)

登録ユーザ: 0
ゲスト: 106

もっと...

アクセスカウンタ

今日 : 1334013340133401334013340
昨日 : 1753317533175331753317533
総計 : 2347648323476483234764832347648323476483234764832347648323476483
Powered by XOOPS Cube 2.1© 2001-2006 XOOPS Cube Project
Design by XoopsDesign.com