flagflag  If you want to see English page, please click "English" Button at Left.
9: 2021-07-12 (月) 00:07:10 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
*** 新しい起動用 Docker イメージの作り方 [#s2d1d7bf] *** 新しい起動用 Docker イメージの作り方 [#s2d1d7bf]
 +**** Dockerfile を使う方法 [#k4d600dc]
 + # 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/*
 +
 +**** Docker commit でイメージを作ると,二重引数の問題が発生 [#t9a36c00]
- iseki でログイン時 - iseki でログイン時
 # docker exec -it jupyter-iseki /bin/bash  # docker exec -it jupyter-iseki /bin/bash
Line 47: Line 72:
  9 cp /etc/subuid- /etc/subuid   9 cp /etc/subuid- /etc/subuid
-- [[start.sh>./start.sh]]+- [[解決>#xeab91b6]]
#br #br
-*** Trouble Shooting [#k2b34ff3] +**** [[start.sh(改)>./start.sh-kai]],  [[start.sh(オリジナル)>./start.sh]][#q31443f9
-**** 何故かイメージを変更して commit すると引数が2重になる? (''非常に重要な問題'')[#xeab91b6+- コンテナ内の /usr/local/bin/start.sh 
-- 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/dockerspawner.py L804 +- 利用できる環境変数 
--- get_command() の cmd + self.get_args() で cmd に既に引数が入っている? + SHELL=/bin/bash 
-- 最新版 (Project用) [[jupyterhub_config.py>../SystemUserSpawner/jupyterhub_config.py]] 内で対症療法中+ 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/iseki/ ​
 + 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:8081/hub/api 
 + JUPYTERHUB_CLIENT_ID=jupyterhub-user-is​eki 
 + JUPYTERHUB_HOST= 
 + CONDA_VERSION=4.9.2 
 + NB_USER=iseki 
 + LC_ALL=en_US.UTF-
 + 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 
#br #br
 +
 +*** 新しいクラスを作成する [#r7a6bb3c]
 +
 +- /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()
 +#br
 +
 +**** 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
 +
 +
 +#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 67: 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 94: 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 103: 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 108: 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 114: 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 141: 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
<今日>

オンライン状況

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

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

もっと...

アクセスカウンタ

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