JupyterLab Docker 部署踩坑

最近手上收集了一些數據,想要分析一下。而後想起來好久前就打算給本身搭一個 Jupyter Lab 環境,擇日不如撞日,乾脆就今天搞定。python

那麼什麼是 Jupyter Notebook 呢?

Juptyer Notebook 是從 IPython 演變出來的在線交互式計算環境,能夠編寫文檔,這個文檔能夠包含代碼、文本(Markdown)、數學、圖標和富媒體。Jupyter LabJupyter Notebook 的下一代用戶界面。nginx

簡單上手

單純跑一個 Jupyter 實際上是很簡單的:git

pip install jupyterlab
jupyter lab
複製代碼

上面的命令就能夠跑起來一個 Jupyter 了,只不過須要 Python 環境。github

由於我要跑在服務器上,不但願服務器的環境太過雜亂,這樣遷移起來就會很麻煩,因此最好跑在 Docker 裏。docker

不幸的是我在實踐 Docker 部署的過程當中踩了不少坑,腦殼都給踩懵了。並且這部分恰恰網上資料比較少,只有官方文檔和部分博客有涉及。因此我在此記錄下個人踩坑歷程,但願對後人有所幫助。shell

因此我都遇到了什麼問題?

  1. Docker 掛載後沒法啓動,提示權限被拒
  2. 啓動後設置密碼報 500 錯誤
  3. 啓動後設置密碼不生效
  4. 新建文件報 404 錯誤

我大體就遇到了上面這些問題,各個都很奇葩。接下來,敬請觀賞我心酸的心路歷程:json

Docker 掛載匿名券後 jupyter 容器沒法啓動

其實直接跑起來容器,是不會報錯的,可是這樣咱們的數據也就跟容器共生共死了,這可不能接受。api

因此須要將 Jupyter 的數據路徑映射到宿主機。接下來就出問題了,啓動報錯:跨域

Container must be run with group "users" to update files
Executing the command: jupyter lab
Traceback (most recent call last):
  File "/opt/conda/lib/python3.7/site-packages/traitlets/traitlets.py", line 528, in get
    value = obj._trait_values[self.name]
KeyError: 'runtime_dir'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
"""堆棧信息隱藏掉"""
PermissionError: [Errno 13] Permission denied: '/home/jovyan/.local'
複製代碼

開始我懷疑是 SELinux 搞鬼,設置後並無效果,並且其餘鏡像跑起來也很正常,一時間沒有想出什麼好辦法,只好直接將掛載的路徑權限改爲 777 後正常啓動了(原本是 755)。這操做...明明其餘鏡像一樣權限都沒問題...bash

啓動後初始化密碼報 500 錯誤

終於啓動成功了,很開心。可是初始化密碼的時候又把我給幹蒙了,直接報了 Http 500 錯誤。 看報錯是找不到 jupyter_notebook_config.json 文件,這個文件是 jupyter 的配置文件。找不到這個文件說明配置初始化失敗了,咱們能夠手動初始化,或者...多重啓幾遍服務(這個是真的有用

手動初始化 juptyer 配置

  1. 首先經過 exec 命令進入容器
  2. 執行命令 jupyter lab --generate-config
  3. 將配置路徑下的文件權限都改成 777。執行 chmod 777 .jupyter/*
  4. 退出容器

**注:**這個方法咱們遷移服務器的時候不須要再作一遍了,由於咱們的數據會備份,配置文件也在咱們備份的範圍內。

啓動後設置密碼不生效

折騰好配置,終於能夠初始化密碼了。結果從新登陸的時候直接提示我密碼錯誤 Invalid credentials。 我他媽的真的,要瘋了。 終於,我找到了解決方案。重啓兩遍服務就行了。GitHub issue

垃圾!

結束了嗎?沒有。新建文件提示 404

到這裏我已經心如止水了,報錯就報錯吧。淦!

-w384

還好這個問題比較容易搞定。看了下 log

[W 13:31:34.069 LabApp] Blocking Cross Origin API request for /api/contents/.  Origin: https://jupyter.fxcdev.com, Host: toner-jupyter:8888
[W 13:31:34.069 LabApp] Not Found
[W 13:31:34.070 LabApp] 404 POST /api/contents/?1573306294042 (172.28.0.3) 1.76ms referer=https://jupyter.fxcdev.com/lab?
複製代碼

是跨域致使的。爲何會跨域呢? 由於走了 nginx 轉發,因此域名改變了。配置一下 nginx 就能夠了。 在 location 對象里加上 proxy_set_header Host $host; 完美解決問題。

結語

文章比較亂,先綜述一下問題解決方式吧:

  1. Docker 掛載匿名券後沒法啓動,提示權限被拒 ———— 修改掛載路徑權限爲 777
  2. 啓動後設置密碼報 500 錯誤 ———— 手動初始化 jupyter 配置,或者多重啓幾遍
  3. 啓動後設置密碼不生效 ———— 多重啓幾遍 jupyter
  4. 新建文件報 404 錯誤 ———— 配置 nginx 轉發的時候順便帶上域名

最後,終於能舒服的用上環境了,過陣子數據分析完了若是有所發現,我會放出來給你們看看~敬請期待!

相關文章
相關標籤/搜索