天天看點

問題解決:使用docker中的jupyter時,挂載本地檔案夾後,在jupyter中無法進行檔案建立、修改等操作,報錯“permission denied”

問題描述:

  • 使用的docker鏡像是 jupyter/datascience-notebook,裡面預裝了常用的機器學習子產品:pandas, matplotlib, scipy, seaborn, scikit-learn, scikit-image, sympy, cython, patsy, statsmodel, cloudpickle, dill, numba, bokeh;
  • 非jupyter官方鏡像源,此docker容器的普通使用者jovyan密碼未公開,不能使用sudo指令進行提權
  • 參考文檔
  • web方式啟動jupyter: 

    docker run -p 8888:8888 jupyter/datascience-notebook

  • 指令行方式啟動并進入容器: 

    docker run -it jupyter/datascience-notebook bash

  • 基于Docker鏡像的開發環境搭建:配置本地代碼所在目錄映射到容器内部:

    sudo docker run -it -p 8888:8888 -v /home/cuc/code:/home/jovyan/work jupyter/datascience-notebook

  • 打開jupyter notebook後,發現無法在挂載的目錄下建立檔案夾或檔案
  • 問題解決:使用docker中的jupyter時,挂載本地檔案夾後,在jupyter中無法進行檔案建立、修改等操作,報錯“permission denied”
    問題解決:使用docker中的jupyter時,挂載本地檔案夾後,在jupyter中無法進行檔案建立、修改等操作,報錯“permission denied”

問題解決:

本地共享目錄的權限情況如下:

[email protected]:~/code $ ll -ls
total 44
 4 drwxrwxr-x 4 cuc  cuc   4096 1月   7 17:01 ./
 4 drwxrwxr-x 6 cuc  cuc   4096 12月 18 14:39 ../
 0 -rw-rw-r-- 1 cuc  cuc      0 1月   7 17:01 a.txt
24 -rw-r--r-- 1 root root 24326 12月 27 10:53 error.log
 4 drwxrwxr-x 6 cuc  cuc   4096 12月 26 20:24 test/
 4 -rw-rw-r-- 1 cuc  cuc    729 12月  6 14:54 README.md
 4 drwxrwxr-x 3 cuc  cuc   4096 12月  6 14:54 test2/
           

進入docker 容器中進行檢視

[email protected]:~/work$ ll -ls
total 44
 4 drwxrwxr-x 5   1001  1001  4096 Jan  7 09:01 ./
 4 drwsrwsr-x 1 jovyan users  4096 Dec 17 22:03 ../
 0 -rw-rw-r-- 1   1001  1001     0 Jan  7 09:01 a.txt
24 -rw-r--r-- 1 root   root  24326 Dec 27 02:53 error.log
 4 drwxrwxr-x 6   1001  1001  4096 Dec 26 12:24 test/
 4 -rw-rw-r-- 1   1001  1001   729 Dec  6 06:54 README.md
 4 drwxrwxr-x 3   1001  1001  4096 Dec  6 06:54 test2/
           

可以看到,檔案的屬主不一緻

檢視docker中的使用者資訊

[email protected]:~/work$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
jovyan:x:1000:100::/home/jovyan:/bin/bash
           

docker 中使用者 jovyan 的 UID 是1000 ,但是挂載的目錄的屬主 UID 是 1001 ,導緻 jovyan使用者無權限進行檔案的操作

解決的方法非常清晰:将UID修改一緻即可 -> 要不就修改本地目錄檔案的屬主,要不就修改docker的使用者UID

在本地使用 chown 指令修改本地目錄的屬主UID

sudo chown -R 1000.1000 code/

重新挂載到docker,經測試,jupyter可以成功建立檔案

問題原因:

本地系統是有兩個使用者的,使用者1的UID是1000,使用者2(cuc)的UID是1001。由于本地目錄是由cuc使用者建立的,挂載到docker中時,檔案屬主不會更改,是以在docker中檢視檔案資訊時,檔案屬主是1001,但是在docker中,預設隻建立了一個普通使用者jovyan,其UID是1000,屬主資訊不一緻,是以無權限進行檔案操作。

由此看來,隻有本地具有多使用者,且操作時不使用UID為1000的使用者使用docker挂載檔案時會出現權限問題。